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")
Другие вопросы по тегам