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 (то есть, текущего "когда-то" в Гринвиче, Англия).

Ответы на вопрос(1)

Ваш ответ на вопрос