首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python datetime strptime()和strftime():如何保留时区信息

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

Stack Overflow用户
提问于 2013-02-08 06:46:14
回答 4查看 166.9K关注 0票数 51

请参阅以下代码:

代码语言:javascript
运行
复制
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)

输出为

代码语言:javascript
运行
复制
2013-02-07 17:42:31 EST
2013-02-07 17:42:31 

时区信息只是在转换过程中丢失了。

如果我将'%Z‘切换到'%z',我会得到

代码语言:javascript
运行
复制
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S %z'

我知道我可以使用python-dateutil,但我发现奇怪的是,我不能在datetime中实现这个简单的功能,而必须引入更多的依赖项?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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字符串,并在另一端将其拆分:

代码语言:javascript
运行
复制
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()对其进行解析。

票数 33
EN

Stack Overflow用户

发布于 2013-02-08 07:43:35

不幸的是,strptime()只能处理操作系统配置的时区,而且只能作为时间偏移。从documentation

%Z指令的支持取决于tzname中包含的值以及daylight是否为true。因此,它是特定于平台的,除了识别UTC和GMT之外,这两个时区总是已知的(并且被认为是非夏令时时区)。

strftime()并不正式支持%z

我担心你不得不使用python-dateutil来支持时区解析。

票数 11
EN

Stack Overflow用户

发布于 2017-08-10 21:07:18

以下是我在Python2.7中的回答

使用时区打印当前时间

代码语言:javascript
运行
复制
from datetime import datetime
import tzlocal  # pip install tzlocal

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

打印具有特定时区的当前时间

代码语言:javascript
运行
复制
from datetime import datetime
import pytz # pip install pytz

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

它将打印如下内容

代码语言:javascript
运行
复制
2017-08-10 20:46:24 +0800
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14762518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档