我有一个使用IPDDump创建的Blackberry IPD备份的CSV转储文件。
这里的日期/时间字符串看起来像这样
(其中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
。
我确实在this page上看到datetime.strptime
显然tzinfo
无声地丢弃了strptime()
,但是,我检查了文档,但我找不到任何有效的文档here
我能够使用第三方Python库dateutil解析日期,但是我仍然对我如何错误地使用内置strptime()
感到好奇吗?有没有办法让{{1}}与时区很好地搭配?
答案 0 :(得分:320)
我建议使用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()
格式的废话......只是在它上面写一个日期,它就是正确的事。
更新:糟糕。我错过了您提到的使用dateutil
的原始问题,对不起。但我希望这个答案对于那些在解析问题并查看该模块的实用程序时遇到这个问题的人来说仍然有用。
答案 1 :(得分:42)
datetime
module documentation说:
返回与date_string对应的日期时间,根据格式进行解析。这相当于
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起已更新,现在相同的文档也说明了以下内容:
当为strptime()方法提供%z指令时,将生成一个知道的datetime对象。结果的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
答案 2 :(得分:9)
您的时间字符串类似于rfc 2822 (date format in email, http headers)中的时间格式。您可以仅使用stdlib解析它:
>>> 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版本生成时区感知日期时间对象的解决方案:parsing date with timezone from an email。
采用此格式EST
is semantically equivalent to -0500
。虽然,通常是a timezone abbreviation is not enough, to identify a timezone uniquely。
答案 3 :(得分:8)
由于strptime
返回具有tzinfo
属性的日期时间对象,因此我们可以简单地将其替换为所需的时区。
>>> import datetime
>>> date_time_str = '2018-06-29 08:15:27.243860'
>>> date_time_obj = datetime.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S.%f').replace(tzinfo=datetime.timezone.utc)
>>> date_time_obj.tzname()
'UTC'
答案 4 :(得分:0)
遇到这个确切的问题。
我最终要做的事情:
BEGIN
GET_STUDENT();
--rollback;
END;