等同于 GNU coreutils /bin/date 输出 Python2(时区)

Equivalent of GNU coreutils /bin/date output with Python2 (timezone)

我想要日期时间格式类似于 Python2 中的 %F %T %Z。如果我天真地使用 datetime.now() 进行操作,时区部分将显示为空。我了解到 Python2 不支持 tzinfo 对象,但有一个第 3 方 pytz 模块。

不幸的是,为了构建 tzinfopytz 我仍然需要明确命名时区。我想要的是 localtime()default 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 w/o 硬编码时区的任何想法?

在具有 /bin/date (non-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 转换期间,此代码也能正常工作。