繁体   English   中英

将RFC 2822日期转换为datetime时可节省1小时

[英]1 hour off when converting RFC 2822 date to datetime

这是我想做的事情:

>>> 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日期时间,但出于某种奇怪的原因,datetime中的小时为9 我真的不明白为什么。

我在UTC + 1,所以某处可能发生了本地时间转换,但是我不知道在哪里。

问题在于, mktime期望元组位于本地时间。 还有calendar.gmtime ,它希望它位于UTC中。 我可能实际上最终会按照@Boaz的建议使用dateutil

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

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

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

时间访问和转换

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

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

>>> calendar.timegm(tup)
1453457700

您也可以使用日期时间。

>>> 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM