将RFC 2822日期转换为日期时间为1小时

时间:2016-01-30 18:26:41

标签: python date datetime utc

这是我想要做的事情:

>>> from email.utils import parsedate
>>> tup = parsedate("Fri, 22 Jan 2016 10:15:00 GMT")
>>> tup
(2016, 1, 22, 10, 15, 0, 0, 1, -1)
>>> import datetime
>>> import time
>>> timestamp = time.mktime(tup)
>>> timestamp
1453454100.0
>>> datetime.datetime.utcfromtimestamp(timestamp)
datetime.datetime(2016, 1, 22, 9, 15)

我使用email.utils.parsedate函数将RFC 2822日期解析为struct_time。这看起来是正确的,小时部分是10。然后,我使用time.mktime将其转换为时间戳,然后,我尝试使用datetime.utcfromtimestamp从中获取UTC日期时间,但由于某些奇怪的原因,日期时间中的小时为{{1 }}。我真的不明白为什么。

我在UTC + 1中,所以可能会转换到某个地方发生的当地时间,但我不知道在哪里。

4 个答案:

答案 0 :(得分:1)

问题是mktime期望元组在本地时间。还有calendar.gmtime,期望它是UTC。我可能实际上最终使用dateutil作为@Boaz推荐

答案 1 :(得分:0)

我建议只使用dateutil https://pypi.python.org/pypi/python-dateutil

将其直接转换为正确的日期时间对象

from dateutil import parser
parser.parse("Fri, 22 Jan 2016 10:15:00 GMT")

答案 2 :(得分:0)

来自Time access and conversions

  

time.mktime(T):
  这是localtime()的反函数。它的参数是struct_time或完整的9元组(因为需要dst标志;如果它是未知的,则使用-1作为dst标志),它以本地时间而不是UTC表示时间。

要获得正确的结果,您应该使用calendar.timegm()

>>> calendar.timegm(tup)
1453457700

答案 3 :(得分:0)

您也可以使用日期时间。

>>> from datetime import datetime as dt
>>> d = "Fri, 22 Jan 2016 10:15:00 GMT"
>>> dt.strptime(d, "%a, %d %b %Y %H:%M:%S %Z")
datetime.datetime(2016, 1, 22, 10, 15)