1 час при преобразовании даты RFC 2822 в дату и время
Вот что я пытаюсь сделать:
>>> 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
и затем я пытаюсь получить дату и время UTC, используя datetime.utcfromtimestamp
, но по какой-то странной причине час в дате и времени 9
, Я действительно не понимаю, почему.
Я нахожусь в UTC+1, так что, вероятно, где-то происходит преобразование в местное время, но я понятия не имею, где.
4 ответа
Проблема в том, что mktime
ожидает, что кортеж будет по местному времени. Есть также calendar.gmtime
, который ожидает, что это будет в UTC. Я мог бы на самом деле просто использовать dateutil, так как @Boaz рекомендует
Из времени доступа и конверсий:
time.mktime (т):
Это обратная функция 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)
Я рекомендую просто использовать dateutil
https://pypi.python.org/pypi/python-dateutil
Он преобразует его непосредственно в правильный объект даты и времени
from dateutil import parser
parser.parse("Fri, 22 Jan 2016 10:15:00 GMT")