Как мне преобразовать дату и время в UTC в Python? - PullRequest
3 голосов
/ 28 октября 2010

С http://docs.python.org/library/time.html:

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

Это говорит о том, что вам нужно указывать свой кортеж по местному времени, а не по 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)

Ответы [ 2 ]

5 голосов
/ 28 октября 2010

Я думаю, что вы ищете 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)
0 голосов
/ 11 июля 2015

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: разбор даты с часовым поясом из электронного письма .

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...