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
。 虽然一般来说, 时区缩写是不够的,但是唯一地确定一个时区 。