6

python3datetime.datetime.strftime无法接受 utf-8 字符串格式

我所做的是::

# encoding: utf-8
import datetime

f = "%Y年%m月%d日"
now = datetime.datetime.now()
print( now.strftime(f) )

我得到的是:

D:\pytools>python a.py
Traceback (most recent call last):
  File "a.py", line 6, in <module>
    print( now.strftime(f) )
UnicodeEncodeError: 'locale' codec can't encode character '\u5e74' in position 2
: Illegal byte sequence

为什么以及如何解决这个问题?

4

5 回答 5

11

问题不在datetime,在print。请参阅打印失败

啊,不完全是——尽管它有相同的原因,而且你可能会遇到将 Unicode 写入标准输出的问题。(使用带有 Python shell 的 IDE,例如最新的 IDLE,可以避免这种情况。)

最终调用的strftime()函数是datetime.strftime()C 标准库的一部分,在 Windows/MSVCRT 下无法处理 Unicode 字符串。(虽然理论上您可以通过将代码页设置为 65001 并使用 UTF-8 来解决它,但该代码页的 C 运行时中存在严重的长期存在的错误。)

Python 中的解决方法可能是在调用之后替换掉非 ASCII 字符:

strftime('%Y{0}%m{1}%d{2}').format(*'年月日')

或者避开strftime并自己做。

通过这两种方式中的任何一种,这可能应该被认为是一个错误time.strftime()并在那里修复。添加一个 Python 原生实现是有意义的——由于该函数中存在其他平台错误,strftime他们已经不得不这样做。strptime

于 2013-04-16T10:49:17.847 回答
3
>>> now.strftime('%Y年%m月%d日 %H时%M分%S秒'.encode('unicode- 
 escape').decode()).encode().decode("unicode-escape")

'2018年04月12日 15时55分32秒'
于 2018-04-12T08:15:21.523 回答
1

我的工作

# -*- coding: utf-8 -*-
import datetime

now = datetime.datetime.now()
print( now )



import re

def strftime(datetimeobject, formatstring):
    formatstring = formatstring.replace("%%", "guest_u_never_use_20130416")
    ps = list(set(re.findall("(%.)", formatstring)))
    format2 = "|".join(ps)
    vs = datetimeobject.strftime(format2).split("|")
    for p, v in zip(ps, vs):
        formatstring = formatstring.replace(p, v)
    return formatstring.replace("guest_u_never_use_20130416", "%")

r = strftime(now, "%%%Y年%m月%d日 %%")
print(r)

结果是

D:\Projects\pytools>python a.py
2013-04-16 20:14:22.518358
%2013年04月16日 %
于 2013-04-16T12:17:24.780 回答
1

我的windows10也有同样的问题,解决方法:

import locale
locale.setlocale(locale.LC_CTYPE, 'chinese')
print(datetime.now().strftime('%Y年%m月%d日 %H时%M分%S秒'))

结果:2017年04月01日15时56分34秒</p>

于 2017-04-01T08:07:21.953 回答
0

它对我有用,见下文:

import datetime
from contextlib import contextmanager
import locale


@contextmanager
def locale_block(local_name: str, lc_var=locale.LC_ALL):
    org_local = locale.getlocale()
    try:
        yield locale.setlocale(lc_var, local_name)
    finally:
        locale.setlocale(lc_var, org_local)


with locale_block('zh'):
    print(datetime.datetime.now().strftime('%Y年%m月%d日'))

with离开语句后,它将恢复语言环境的值。

于 2020-07-08T08:09:15.743 回答