我有datetime对象,我的用户提供他们自己的格式字符串来按他们喜欢的方式格式化时间。
我发现的一种方法是使用'{:...}'.format(mydatetime)。
lt = time.localtime(time.time())
d = datetime. datetime.fromtimestamp(time.mktime(lt))
print(userString.format(datetime=d))英语用户可以提供'{datetime:%B %d, %Y}'格式,格式截止到2013年12月24日。
中国用户可以提供'{datetime:%Y年%m月%d日}' ( YYYYMMDD格式,年=Year,月=Month,日=Day)。
但在执行'{datetime:%Y年%m月%d日}'.format(datetime=d)时,Python会引发UnicodeEncodingError:'locale‘编解码器无法在位置2中编码字符'\u5e74’:非法字节序列
我知道有一个解决办法,我可以告诉我的中文用户给格式字符串类似'{datetime:%Y}年{datime:%m}月{datetime:%d}日',但不能在format_spec中显示unicode字符吗?如何解决这个问题?
我在用Windows。
谢谢
发布于 2013-12-25 07:06:49
datetime.__format__调用datetime.strftime,后者进行一些预处理,然后调用time.strftime (CPython 3.3.3源)。
在Windows上,time.strftime使用C运行时的多字节字符串函数strftime,而不是宽字符字符串函数wcsftime。首先,它必须根据当前区域设置通过调用PyUnicode_EncodeLocale对格式字符串进行编码。这反过来调用CRT函数wcstombs (MSDN),它为LC_CTYPE类别使用当前配置的区域设置。如果进程当前使用默认的"C“区域设置,则wcstombs直接将拉丁文-1(代码<256个)转换为字节,其他任何内容都是EILSEQ错误,即“非法字节序列”。
使用locale模块设置新的区域设置。实际的语言环境名称因平台而异,但使用微软的setlocale,您应该能够设置一个语言串,并为给定的语言使用默认的代码页。通常,对于库来说,您不应该处理这个问题,并且应用程序应该在启动时配置区域设置。例如:
>>> import datetime, locale
>>> oldlocale = locale.setlocale(locale.LC_CTYPE, None)
>>> oldlocale
'C'
>>> newlocale = locale.setlocale(locale.LC_CTYPE, 'chinese')
>>> d = datetime.datetime.now()
>>> '{datetime:%Y\\u5e74%m\\u6708%d\\u65e5}'.format(datetime=d)
'2013\\u5e7412\\u670825\\u65e5'如果您希望格式化的时间使用特定于地区的名称(例如月和日),那么还可以设置LC_TIME类别:
>>> newlocale = locale.setlocale(locale.LC_TIME, 'chinese')
>>> '{datetime:%B %d, %Y}'.format(datetime=d)
'\u5341\u4e8c\u6708 25, 2013'https://stackoverflow.com/questions/20762326
复制相似问题