Как преобразовать дату и время в метку времени UTC в Python?

Из http://docs.python.org/library/time.html:

time.mktime(т):     Это обратная функция localtime(). Его аргументом является struct_time или полный 9-кортеж (поскольку флаг dst необходим; использовать -1 как dst флаг, если он неизвестен), который выражает время в местное время, а не UTC. Это возвращает число с плавающей запятой, для совместимость со временем(). Если входное значение не может быть представлено как допустимое время, либо OverflowError, либо ValueError будет поднят (что зависит от того, является ли недопустимое значение попадает на Python или C). Самая ранняя дата который он может генерировать зависит от платформы.

Это говорит о том, что вам нужно указать свой кортеж по местному времени, а не UTC. Тем не менее, я хочу указать в UTC; Я не хочу использовать локальный часовой пояс в поле.

Есть ли способ, по которому я могу перейти от даты и времени к отметке времени, где время рассматривается как UTC? Я хочу иметь возможность сохранить все в нормализованной форме UTC (объект datetime), когда я конвертирую в и из временных меток.

Я хочу иметь возможность сделать что-то подобное, и x и y выходят одинаково:

 y = datetime.datetime.utcfromtimestamp(time.mktime(x.timetuple()))
 x = dateutil.parser.parse('Wed, 27 Oct 2010 22:17:00 GMT')
 stamp = time.mktime(x.timetuple())
 y = datetime.datetime.utcfromtimestamp(stamp)
 x
datetime.datetime(2010, 10, 27, 22, 17, tzinfo=tzutc())
 y
datetime.datetime(2010, 10, 28, 6, 17)

Ответ 1

Я думаю, что вы ищете calendar.timegm:

import datetime
import dateutil.parser
import calendar

x = dateutil.parser.parse('Wed, 27 Oct 2010 22:17:00 GMT')
stamp = calendar.timegm(x.timetuple())
y = datetime.datetime.utcfromtimestamp(stamp)
print(repr(x))
# datetime.datetime(2010, 10, 27, 22, 17, tzinfo=tzutc())

print(repr(y))
# datetime.datetime(2010, 10, 27, 22, 17)

Ответ 2

email пакет из stdlib может анализировать временную строку в формате rfc 5322 (ранее rfc 2822, rfc 822):

#!/usr/bin/env python
from datetime import datetime, timedelta
from email.utils import mktime_tz, parsedate_tz

time_tuple = parsedate_tz('Wed, 27 Oct 2010 22:17:00 GMT')
posix_timestamp = mktime_tz(time_tuple)  # integer
utc_time = datetime(*time_tuple[:6])     # naive datetime object
assert utc_time == (datetime(1970, 1, 1) + timedelta(seconds=posix_timestamp))

См. Python: разбор даты с часового пояса из электронной почты.

Чтобы преобразовать наивный объект datetime, представляющий время в UTC, в метку времени POSIX:

posix_timestamp = (utc_time - datetime(1970, 1, 1)).total_seconds()

См. Преобразование datetime.date в метку времени UTC в Python.