请参阅以下代码:
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中实现这个简单的功能,而必须引入更多的依赖项?
发布于 2013-02-08 07:55:03
这里的部分问题是,通常用于表示时区的字符串实际上并不唯一。"EST“对北美人来说只意味着" America /New_York”。这是C time API中的一个限制,Python解决方案是…如果任何人愿意编写PEP,我希望在未来的某个版本中随时添加完整的tz功能。
您可以格式化和解析时区作为偏移量,但这会丢失夏令时/夏令时信息(例如,您无法在夏季区分"America/Phoenix“和”America/Los Angeles“)。您可以将时区格式化为3个字母的缩写,但不能将其解析回来。
如果你想要一些模糊和模棱两可但通常是你想要的东西,你需要一个像dateutil
这样的第三方库。
如果你想要一些明确的东西,只需自己将实际的tz名称附加到本地datetime字符串,并在另一端将其拆分:
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“。因此,如果您真的想这样做,可以将%Z
留在格式化端,然后在将其余部分传递给strptime
之前,使用pytz.timezone()
对其进行解析。
发布于 2013-02-08 07:43:35
不幸的是,strptime()
只能处理操作系统配置的时区,而且只能作为时间偏移。从documentation
对
%Z
指令的支持取决于tzname
中包含的值以及daylight
是否为true。因此,它是特定于平台的,除了识别UTC和GMT之外,这两个时区总是已知的(并且被认为是非夏令时时区)。
strftime()
并不正式支持%z
。
我担心你不得不使用python-dateutil
来支持时区解析。
发布于 2017-08-10 21:07:18
以下是我在Python2.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
https://stackoverflow.com/questions/14762518
复制相似问题