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 часов, ДО того, как оно станет текущим временем в Нью-Йорке.

Следовательно, мы можем видеть, что есть две вещи: общее значение «некоторое время» и понятие, что это «некоторое время» становится текущим временем в разных местах в разные «времена». (здесь нет каламбура, читайте дальше)

Теперь давайте сначала определим, что такое «эпоха». Мы знаем, что «некоторое время» - это просто общее время. Затем эпоха - это «некоторое время», произошедшее в Гринвичской Англии, где значения параметров: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 (то есть, текущего "некоторого времени" в Гринвичской Англии).