51

请参阅以下代码:

import datetime
import pytz

fmt = '%Y-%m-%d %H:%M:%S %Z'

d = datetime.datetime.now(pytz.timezone("America/New_York"))
d_string = d.strftime(fmt)
d2 = datetime.datetime.strptime(d_string, fmt)
print d_string 
print d2.strftime(fmt)

输出是

2013-02-07 17:42:31 EST
2013-02-07 17:42:31 

时区信息只是在翻译中丢失了。

如果我将“%Z”切换为“%z”,我会得到

ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S %z'

我知道我可以使用python-dateutil,但我只是觉得奇怪的是我无法在 datetime 中实现这个简单的功能并且必须引入更多的依赖关系?

4

4 回答 4

33

这里的部分问题是通常用于表示时区的字符串实际上并不是唯一的。“EST”对北美人来说仅意味着“America/New_York”。这是 C 时间 API 的一个限制,而 Python 解决方案是……如果有人愿意编写 PEP,那么现在任何一天都可以在未来的某个版本中添加完整的 tz 功能。

可以将时区格式化和解析为偏移量,但这会丢失夏令时/夏季时间信息(例如,您无法在夏季区分“America/Phoenix”和“America/Los_Angeles”)。您可以将时区格式化为 3 个字母的缩写,但不能从中解析回来。

如果你想要一些模糊不清但通常是你想要的东西,你需要一个第三方库,比如dateutil.

如果你想要一些真正明确的东西,只需将实际的 tz 名称附加到本地日期时间字符串,然后在另一端将其拆分:

d = datetime.datetime.now(pytz.timezone("America/New_York"))
dtz_string = d.strftime(fmt) + ' ' + "America/New_York"

d_string, tz_string = dtz_string.rsplit(' ', 1)
d2 = datetime.datetime.strptime(d_string, fmt)
tz2 = pytz.timezone(tz_string)

print dtz_string 
print d2.strftime(fmt) + ' ' + tz_string

或者......在这两者之间,您已经在使用该pytz库,它可以解析(根据一些任意但明确定义的消歧规则)格式,如“EST”。因此,如果您真的想要,您可以将%Zin 保留在格式化一侧,然后将其拉出并解析它,pytz.timezone()然后再将其余部分传递给strptime.

于 2013-02-07T23:55:03.130 回答
11

不幸的是,strptime()只能处理您的操作系统配置的时区,然后只能作为时间偏移量,真的。从文档中:

%Z指令的支持基于其中包含的值tzname以及是否daylight为真。因此,它是特定于平台的,除了识别始终已知的 UTC 和 GMT(并且被认为是非夏令时时区)。

strftime()官方不支持%z

python-dateutil恐怕你坚持支持时区解析。

于 2013-02-07T23:43:34.977 回答
4

这是我在 Python 2.7 中的回答

使用时区打印当前时间

from datetime import datetime
import tzlocal  # pip install tzlocal

print datetime.now(tzlocal.get_localzone()).strftime("%Y-%m-%d %H:%M:%S %z")

使用特定时区打印当前时间

from datetime import datetime
import pytz # pip install pytz

print datetime.now(pytz.timezone('Asia/Taipei')).strftime("%Y-%m-%d %H:%M:%S %z")

它会打印出类似的东西

2017-08-10 20:46:24 +0800
于 2017-08-10T13:07:17.767 回答
0

试试这个:

import pytz
import datetime

fmt = '%Y-%m-%d %H:%M:%S %Z'

d = datetime.datetime.now(pytz.timezone("America/New_York"))
d_string = d.strftime(fmt)
d2 = pytz.timezone('America/New_York').localize(d.strptime(d_string,fmt), is_dst=None)
print(d_string)
print(d2.strftime(fmt))
于 2021-01-13T18:14:39.440 回答