Python: конвертировать время UTC в UTC
Моя проблема: мне нужно преобразовать кортеж времени UTC в метку времени UTC. Но у меня есть некоторые заблуждения.
Сначала немного информации:
time.mktime(tuple)
: эта функция всегда возвращает отметку времени вместный время.
Это обратная функция localtime (). Его аргумент - это struct_time или полный 9-кортеж, который выражает время вместное время, а не UTC.
calendar.timegm(tuple)
: это возвращаетМетка времени UTC из предоставленного кортежа времени
принимает кортеж времени, такой как возвращенный функцией gmtime () в модуле времени, и возвращает соответствующее значение метки времени Unix. По факту,time.gmtime () и timegm () друг друга обратный
Теперь давайтесделать тест:
>>> from datetime import datetime
>>> import time
>>> import calendar as cal
>>> utc_now = datetime.utcnow()
>>> now = datetime.now()
>>> utc_now
datetime.datetime(2013, 3, 16, 9, 17, 22, 489225)
>>> now
datetime.datetime(2013, 3, 16, 5, 17, 29, 736903)
>>> time.mktime(datetime.timetuple(utc_now)), time.mktime(datetime.timetuple(now))
(1363439842.0, 1363425449.0)
>>> cal.timegm(datetime.timetuple(utc_now)), cal.timegm(datetime.timetuple(now))
(1363425442, 1363411049)
Почему есть четыре разных значения? И какой из них правильный, когда я хочу преобразовать кортеж времени UTC в метку времени UTC?
UPDATTE
Я думаю, что нашел ответы на мои заблуждения, поэтому позвольте мне объяснить.
Во-первых, нам нужно знать что-то важное:
Существует два вида объектов даты и времени: «наивный» а также "знают».
Осведомленный объект обладает достаточными знаниями о применимых алгоритмических и политических настройках времени, таких как информация о часовом поясе и летнем времени, чтобы найти себя относительно других осведомленных объектов. Осведомленный объект используется для представления определенного момента времени, который не доступен для интерпретации [1].
Наивный объект не содержит достаточно информации, чтобы однозначно определить свое местоположение относительно других объектов даты / времени.То, представляет ли наивный объект Всемирное координированное время (UTC), местное время или время в каком-либо другом часовом поясе, зависит только от программы, точно так же как от программы зависит, представляет ли конкретное число метры, мили или массу. Наивные объекты легко понять и работать с ними за счет игнорирования некоторых аспектов реальности.
Что мы получаем отdatetime.utcnow()
или жеdatetime.now()
являются "наивный» объекты. Это означает, чтоdatetime
возвращаемый объект, в любом случае, ничего не говорит о вашем местном времени или времени UTC - он просто представляет "когда-то", Это просто инкапсулирует дату и информация о времени (год, месяц, день, час, минуты, секунды и т. д.). Это ваша ответственность, чтобы связать это с понятием местного или UTC.
Итак, помните, что наивный объект datetime просто представляет "когда-то",datetime.now()
функция возвращает "когда-то" что равно вашему текущему времени, аdatetime.utcnow()
функция возвращаеткогда-то" это текущее время в Гринвиче, Англия (что такое UTC).
"когда-то" это просто значение для даты и время. И обратите внимание, что в разных местах на земле, "когда-то" происходит в разное время. Например, если "когда-то" значение 1 января, 10:30, тогда это будет текущее время в Гринвиче, Англия, около 5 часов ДО того, как оно станет текущим временем в Нью-Йорке.
Отсюда видно, что есть две вещи:когда-то" значение, и понятие, что это "когда-то" становится текущее время в разных местах на разныхраз», (здесь нет каламбура, читайте дальше)
Теперь давайтесначала определим, что естьэпоха», Мы знаем это "когда-то" это просто общее значение времени. Тогда эпоха "когда-то" это произошло в Гринвиче, Англия, где значения параметров: .A "January 1 1970, 00:00:00
отметка времени» нет. секунд, прошедших с эпохи. Это означает, что отметка времени была0
когда было времяJan 1, 1970, 00:00:00
в гринвичской англии. Но отметка времени была ок. (5 * 60 * 60), когда время былоJan 1, 1970, 00:00:00
в Нью-Йорке.
>>> tt = datetime.timetuple(datetime(1970, 1, 1, 0, 0, 0))
>>> cal.timegm(tt)
0
Таким образом, мы видим, что то же самоекогда-то" ценностьJan 1, 1970, 00:00:00
имеет разные временные метки, когда мы меняем местоположение. Следовательно, когда вы говорите о метке времени, вы должны также сказать:какое место " это отметка времени, относящаяся к Гринвичской Англии, и то, насколько восточно или западно это местоположение относится к Гринвичской Англии. Это место выражается как "часовой пояс".
Теперь каждая система (компьютер) имеет настроенный часовой пояс, и все временные метки, связанные с этим часовым поясом, фактически становятся "местный", UTC является глобальной ссылкой.
Так что давайте'говорят, что у вас естьX
значение для "когда-то" который преобразуется в:
Y
отметка времени в вашем местном времениZ
метка времени в UTCтогда это означает, чтоY
нет. секунд должно пройтикогда-то" стать текущим временем в вашем месте иZ
ни одна секунда не должна пройти, чтобы текущее время в Гринвичской Англии стало "когда-то".
Теперь, наконец, давайтевернуться к нашим функциямmktime
а такжеtimegm
, Они занимают время, которое является еще одним представлением для "когда-то", Помните, что мыповторяя их наивное время, которое не имеет никакого понятия о местном или UTC.
Позволять'скажиX
это кортеж времени, представляющий наивныйкогда-то", затем
mktime(X)
вернет нет. секунд, которые должны пройти, чтобы ваше местное текущее время стало таким "когда-то", а такжеtimegm(X)
вернет количество секунд, которое нужно потратить, чтобы сделать текущее время Гринвичской Англии равным этому »когда-то".В приведенном выше примереnow
а такжеutc_now
представлять наивныйкогда-то"и когда мы их кормимкогда-то" значения вmktime
а такжеtimegm
, они просто возвращают нет. секунд, которые должны пройти для соответствующих местоположений (ваше местоположение и Гринвичская Англия), чтобы их текущее время было таким "когда-то".
Наконец, вернемся к моей проблеме: мне нужно преобразовать кортеж времени UTC в метку времени UTC.
Во-первых, нет понятия "UTC время-кортеж -- Это'простокогда-то", Если мне нужно преобразовать его в UTC, я просто использую:timegm
cal.timegm(datetime.timetuple(utc_now))
который даст мне метку времени для текущего времени UTC (то есть, текущего "когда-то" в Гринвиче, Англия).