我想要一个像Python2中的%F %T %Z
一样格式化的日期时间。如果我天真地使用datetime.now()
,则时区部分显示为空。我了解到Python2不支持tzinfo
对象,但有一个第三方pytz
模块。
不幸的是,为了用pytz
构造tzinfo
,我仍然需要显式地命名时区。我想要的是localtime()
和默认tzinfo
的组合,这样我就可以在本地时区中获得当前时间。
比较以下三个输出:
>>> from datetime import datetime
>>> datetime.now().strftime("%F %T %Z")
"2016-01-11 16:13:22 "
>>> import pytz
>>> datetime.now(pytz.timezone('CET')).strftime("%F %T %Z")
"2016-01-11 16:13:37 CET"
>>> from time import localtime
>>> datetime(*(localtime()[:7])).strftime("%F %T %Z")
"2016-01-11 16:14:24 "
第二个是我想要的,不需要明确指定时区。另一方面,/bin/date
不需要任何提示即可查找时区:
$ /bin/date
Mo 11. Jan 16:17:31 CET 2016
查看date(1)
的源代码,我可以看到,当使用glibc编译时,它依赖于tm_zone
字段作为struct tm
的一部分,但否则将需要设置TZ
环境变量。
有什么想法可以让Python2在没有对时区进行硬编码的情况下工作吗?
在带有/bin/date
(非Windows)的平台上,以给定格式打印当前本地时间:
>>> import time
>>> time.strftime('%F %T %Z')
'2016-01-12 08:12:50 CET'
要便携复制,您需要tzlocal
,它可以找到与您本地时区对应的pytz
tzinfo:
#!/usr/bin/env python
from datetime import datetime
import tzlocal # pip install tzlocal
local_time = datetime.now(tzlocal.get_localzone())
print(local_time.strftime('%Y-%m-%d %H:%M:%S%z (%Z)'))
# -> 2016-01-12 08:12:51+0100 (CET)
%F
、%T
是不可移植的。
即使在本地时间可能不明确的DST转换期间,此代码也能工作。