使用 strptime() 解析日期/时间字符串时如何保留时区?

新手上路,请多包涵

我有一个来自黑莓 IPD 备份的 CSV 转储文件,使用 IPDDump 创建。这里的日期/时间字符串看起来像这样(其中 EST 是澳大利亚时区):

 Tue Jun 22 07:46:22 EST 2010

我需要能够在 Python 中解析这个日期。起初,我尝试使用 datettime 中的 strptime() 函数。

 >>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z')

但是,由于某种原因,返回的 datetime 对象似乎没有任何 tzinfo 与之关联。

我确实在 这个页面 上读到 datetime.strptime 默默地丢弃 tzinfo ,但是,我检查了文档,但我找不到任何与此相关的内容记录 在这里

有没有办法让 strptime() 与时区一起玩?

原文由 victorhooi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 881
2 个回答

datetime 模块文档 说:

返回一个date_string对应的datetime,根据格式解析。这相当于 datetime(*(time.strptime(date_string, format)[0:6]))

看到 [0:6] 了吗?这让你 (year, month, day, hour, minute, second) 。没有其他的。没有提到时区。

有趣的是,[Win XP SP2, Python 2.6, 2.7] 将您的示例传递给 time.strptime 不起作用,但如果您去掉“%Z”和“EST”,它就起作用了。也可以使用“UTC”或“GMT”代替“EST”。 “PST”和“MEZ”不起作用。令人费解。

值得注意的是,这已经更新为 3.2 版,并且相同的文档现在还说明了以下内容:

当 %z 指令提供给 strptime() 方法时,将生成一个感知日期时间对象。结果的 tzinfo 将设置为时区实例。

请注意,这不适用于 %Z,因此大小写很重要。请参阅以下示例:

 In [1]: from datetime import datetime

In [2]: start_time = datetime.strptime('2018-04-18-17-04-30-AEST','%Y-%m-%d-%H-%M-%S-%Z')

In [3]: print("TZ NAME: {tz}".format(tz=start_time.tzname()))
TZ NAME: None

In [4]: start_time = datetime.strptime('2018-04-18-17-04-30-+1000','%Y-%m-%d-%H-%M-%S-%z')

In [5]: print("TZ NAME: {tz}".format(tz=start_time.tzname()))
TZ NAME: UTC+10:00

原文由 John Machin 发布,翻译遵循 CC BY-SA 3.0 许可协议

我推荐使用 python-dateutil 。到目前为止,它的解析器已经能够解析我输入的每一种日期格式。

 >>> from dateutil import parser
>>> parser.parse("Tue Jun 22 07:46:22 EST 2010")
datetime.datetime(2010, 6, 22, 7, 46, 22, tzinfo=tzlocal())
>>> parser.parse("Fri, 11 Nov 2011 03:18:09 -0400")
datetime.datetime(2011, 11, 11, 3, 18, 9, tzinfo=tzoffset(None, -14400))
>>> parser.parse("Sun")
datetime.datetime(2011, 12, 18, 0, 0)
>>> parser.parse("10-11-08")
datetime.datetime(2008, 10, 11, 0, 0)

等等。没有处理 strptime() 格式废话……只是给它一个日期,它做正确的事。

原文由 Joe Shaw 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题