Python datetime strptime()和strftime():如何保存时区信息

Ven*_*tta 49 python datetime python-datetime python-dateutil

请参阅以下代码:

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)
Run Code Online (Sandbox Code Playgroud)

输出是

2013-02-07 17:42:31 EST
2013-02-07 17:42:31 
Run Code Online (Sandbox Code Playgroud)

时区信息在翻译中丢失了.

如果我将'%Z'切换为'%z',我明白了

ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S %z'
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用python-dateutil,但我发现它很棒,我无法在datetime实现这个简单的功能,并且必须引入更多的依赖?

aba*_*ert 31

这里的部分问题是通常用于表示时区的字符串实际上并不是唯一的."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
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*ers 11

不幸的是,strptime()它只能处理您的操作系统配置的时区,而且只能作为时间偏移.从文档:

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

strftime()不正式支持%z.

python-dateutil我担心你会支持时区解析.