相当于GNU coreutils/bin/date与Python2(时区)的输出



我想要一个像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转换期间,此代码也能工作。

相关内容

  • 没有找到相关文章

最新更新