这是我想要做的事情:
>>> 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中,所以可能会转换到某个地方发生的当地时间,但我不知道在哪里。
答案 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)