当前位置: 首页 > 面试题库 >

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

公冶智刚
2023-03-14
问题内容

请参见以下代码:

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,但是我只是发现我无法在日期时间中实现此简单功能而不得不引入更多的依赖关系,这真是不可思议。


问题答案:

这里的部分问题是通常用于表示时区的字符串实际上并不是唯一的。“ EST”对北美的人仅表示“ America /
New_York”。这是C时间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”之类的格式。因此,如果您确实愿意,可以将%Zin留在格式方面,然后将其拉下并进行解析,pytz.timezone()然后再将其余部分传递给strptime



 类似资料:
  • 问题内容: 我已经开始使用推荐的广告,并从移走了。我无法重新粘合在一起的一件事是使用持久性Cookie存储。我想简单地将自定义cookie处理程序/管理器附加到我的连接中以存储cookie。Android文档并不是很有帮助,因为它将Cookie主题分为两行。 我以前使用过LoopJ ,效果很好。 关于如何在Android中设置可以附加到我的自动保存和检索cookie 的持久性cookie存储的想法

  • 我有一个由用户创建的日期对象,其中时区由浏览器填充,如下所示: 不过,当我把它串起来时,时区就消失了 在保留浏览器时区的同时获取ISO8601字符串的最佳方法是使用矩。js和使用<代码>矩。format()。内部字符串化(在本例中为AngularJS) 为了完整性,我的域确实需要本地时间和偏移量。

  • 问题内容: 我正在考虑在用户登录时将日期存储在我的网站中,但是我不知道什么是最合乎逻辑的解决方案。 最初,我虽然使用服务器时区,然后使用服务器计算机日期和用户计算机日期之间的差异操作来管理它,但是我也考虑过使用时区和php类日期来更改它的准确性,因此: 我的问题是,最好的解决方案是保留服务器时区还是使用用户时区? 如果我使用用户时区,是否也应像示例中那样保存时区名称? 问题答案: 我建议使用服务器

  • 我是Coda Hale Metrics的新手。我创建了一个示例spring应用程序,它有一个简单的RESTful web服务方法。 我使用了Coda Hale Metrics framework提供的Meter、Timer和Counter工具来跟踪请求数量、请求比率和请求持续时间。目前,我使用console Reporter of Metrics(请查找下面的代码)将这些信息输出到控制台。 我有几

  • 我的短信有点小问题。在文本的某些部分,我使用了' '来确保该特定单词不会中断(或移动)到新行。举个例子,我做了这样的事情: 所以从理论上讲,这个文本('-is')不应该以一个单词的形式出现在一个新的行中,对吧?我想那是对的。但是...这个技巧给我带来了一个问题,就是在“-”和“is”之间增加了很大的空格...而且我当然不想有那个“大空位”。我将给出结果示例: 如你所见,有一个巨大的空间。所以,我的

  • 问题内容: 如何更新OpenJDK的时区信息?Oracle推出了tzupdater,但这受其许可证的约束,因此我不想使用它。我正在寻找一种开源替代方案,该方案将允许我仅更新时区信息,而不是整个JRE。 问题答案: Azul最近发布了一个开源工具来更新TZ数据:https : //www.azul.com/products/open-source- tools/ziupdater-time-zone