Python strptime() and timezones?
我有一个使用IPDDump创建的Blackberry IPD备份的CSV转储文件。
这里的日期/时间字符串看起来像这样
(其中
1 | Tue Jun 22 07:46:22 EST 2010 |
我需要能够在Python中解析这个日期。 起初,我尝试使用datettime中的
1 | >>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z') |
但是,由于某种原因,返回的
我在这个页面上看到显然
我已经能够使用第三方Python库dateutil来解析日期,但是我仍然很好奇我是如何错误地使用内置的
我建议使用python-dateutil。它的解析器已经能够解析到目前为止我抛出的每种日期格式。
1 2 3 4 5 6 7 8 9 | >>> 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) |
等等。没有处理
更新:哎呀。我在你原来的问题中错过了你提到你使用
Return a datetime corresponding to date_string, parsed according to format. This is equivalent to
datetime(*(time.strptime(date_string, format)[0:6])) .
看到
有趣的是,[Win XP SP2,Python 2.6,2.7]将您的示例传递给
值得注意的是,自版本3.2起已更新,现在相同的文档也说明如下:
When the %z directive is provided to the strptime() method, an aware datetime object will be produced. The tzinfo of the result will be set to a timezone instance.
请注意,这不适用于%Z,因此这种情况很重要。请参阅以下示例:
1 2 3 4 5 6 7 8 9 10 11 | 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 |
您的时间字符串类似于rfc 2822中的时间格式(电子邮件中的日期格式,http标头)。你可以只使用stdlib解析它:
1 2 3 | >>> 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版本生成时区感知日期时间对象的解决方案:使用电子邮件中的时区解析日期。
在这种格式中,