Python strptime()和时区?

我有一个来自Blackberry IPD备份的CSV转储文件,使用IPDDump创build。 这里的date/时间string看起来像这样(其中EST是澳大利亚时区):

 Tue Jun 22 07:46:22 EST 2010 

我需要能够在Python中parsing这个date。 起初,我试图从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 ,但是,我检查了文档,我找不到任何这种logging在这里 。

我已经能够使用第三方Python库dateutil得到parsing的date,但是我仍然对我是如何错误地使用in-built的strptime()感到好奇的? 有什么办法让strptime()和时区一起玩吗?

datetime模块文档说:

返回date_string对应的date时间,按照格式进行parsing。 这相当于datetime(*(time.strptime(date_string, format)[0:6]))

看到那个[0:6] ? 那得到你(year, month, day, hour, minute, second) 。 没有其他的。 没有提及时区。

有趣的是,[Win XP SP2,Python time.strptime ]将您的示例传递给time.strptime不起作用,但是如果剥离“%Z”和“EST”,它将起作用。 也使用“UTC”或“GMT”而不是“EST”的作品。 “PST”和“MEZ”不起作用。 令人费解。

我build议使用python-dateutil 。 它的parsing器已经能够parsing到目前为止我所引用的每个date格式。

 >>> 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()格式的废话…只是把它的date,它是正确的事情。

更新 :糟糕。 我错过了你原来的问题,你提到你使用了dateutil ,抱歉。 但是,我希望这个答案对其他遇到这个问题的人来说仍然有用,因为他们有dateparsing问题并且看到这个模块的实用性。

您的时间string与rfc 2822(电子邮件中的date格式,http标头)中的时间格式类似。 你只能用stdlibparsing它:

 >>> from email.utils import parsedate_tz >>> parsedate_tz('Tue Jun 22 07:46:22 EST 2010') (2010, 6, 22, 7, 46, 22, 0, 1, -1, -18000) 

查看为各种Python版本生成可识别时区的date时间对象的解决scheme: 从电子邮件中parsing具有时区的date 。

在这种格式下, EST在语义上相当于-0500 。 虽然一般来说, 时区缩写是不够的,但是唯一地确定一个时区 。