首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python strptime()和时区?

Python strptime()和时区?
EN

Stack Overflow用户
提问于 2010-07-22 10:42:08
回答 6查看 236.4K关注 0票数 204

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

代码语言:javascript
复制
Tue Jun 22 07:46:22 EST 2010

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

代码语言:javascript
复制
>>> 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,然而,我查看了文档,我找不到任何与此相关的文档here

我已经能够使用第三方Python库dateutil来解析日期,但是我仍然很好奇我是如何错误地使用内置的strptime()的?有没有办法让strptime()很好地利用时区呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-07-22 16:08:36

datetime module documentation说:

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

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

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

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

将%z指令提供给strptime()方法时,将生成一个可识别的datetime对象。结果的tzinfo将被设置为一个时区实例。

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

代码语言:javascript
复制
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
票数 81
EN

Stack Overflow用户

发布于 2011-12-16 02:52:20

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

代码语言:javascript
复制
>>> 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,很抱歉。但我希望这个答案仍然对其他人有用,当他们有日期解析问题并看到该模块的实用程序时,偶然发现了这个问题。

票数 387
EN

Stack Overflow用户

发布于 2020-09-21 16:04:07

由于strptime返回一个具有tzinfo属性的datetime对象,因此我们可以简单地将其替换为所需的时区。

代码语言:javascript
复制
>>> 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'
票数 45
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3305413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档