Сравнение времени в UTC со временем в восточном времени с использованием Python

Я пытаюсь сравнить два раза с помощью Pythondatetime модуль, но я не могу создать часовой поясtime Объект в UTC.

<code>>>> import pytz, datetime
>>> UTC_TZ = pytz.utc
>>> EASTERN_TZ = pytz.timezone('America/New_York')
>>> d1 = datetime.time(10, tzinfo = UTC_TZ)
>>> d1
datetime.time(10, 0, tzinfo=<UTC>)
>>> d2 = datetime.time(10, tzinfo = EASTERN_TZ)
>>> d2
datetime.time(10, 0, tzinfo=<DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)
>>> d1 < d2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware times
</code>

Это ошибка? Нужно ли использовать специальный часовой пояс UTC? Что происходит?

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

что проблема в том, что UTC считается не-временной зоной, или, возможно, "смещенным наивным"? Я рекомендую преобразовать все в UTC, прежде чем делать какие-либо сравнения.

Очевидно, вам нужно знать часовые пояса для входов и выходов, но вы должны стараться сохранять все свои внутренние представления в формате UTC и, возможно, просто сохранять часовой пояс каждого пользователя и конвертировать, когда вам это нужно. Это сохранит много головной боли в долгосрочной перспективе.

Кроме того, вы не должны делать это таким образом. Это лучше использовать

timezone.localize(dt)

как объяснено здесь:http://pytz.sourceforge.net/#localized-times-and-date-arithmetic

 04 сент. 2014 г., 13:22
@ChrisB .: один и тот же часовой пояс может иметь разные смещения UTC в разные даты, т.е.tz + datetime.time() недостаточно, чтобы узнать правильное смещение UTC, вам нужноtz + datetime.datetime при условии, что данное время существует, и оно не является двусмысленным.
 Chris B.09 мая 2012 г., 23:26
EASTERN_TZ.localize(datetime.time(10)) дает мнеTypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'

потому что вы пытаетесь измерить разницу между однимtime объект, который может быть привязан к определенному моменту UTC и другомуtime объект, который является "наивным" и не может быть привязан к определенному моменту UTC. Исправление заключается либо в том, чтобы сделать оба сравнения смещенными, либо в обоих случаях наивными.

Ниже используетdatetime объекты, но это в основном та же самая идея.

import datetime, time, pytz

EST = pytz.timezone('America/New_York')
UTC = pytz.timezone('Etc/UTC')
dt1 = datetime.datetime.fromtimestamp(time.time(), EST)
# ... time passes
dt2 = datetime.datetime.fromtimestamp(time.time(), UTC)
elapsed = dt2 - dt1
 Chris B.10 мая 2012 г., 00:16
@ Марк Рэнсом: Это не так. Возвращаетсяdatetime.timedelta(0).
 10 мая 2012 г., 00:57
Я думаю, потому что дляAmerica/New_York смещение UTC не может быть вычислено толькоtime объект; вам понадобитсяdatetime решить, была ли летняя экономия.
 10 мая 2012 г., 00:13
@ChrisB., ТестUTC_TZ и посмотрим, вернется ли онNone заutcoffset.
 Chris B.09 мая 2012 г., 23:57
Это ошибка в Python, тогда? Документация гласит: «Объект d типа time или datetime может быть наивным или осведомленным. d знает, что d.tzinfo не равно None, а d.tzinfo.utcoffset (d) не возвращает None. Если d.tzinfo равно None или d.tzinfo не равно None, но d.tzinfo.utcoffset (d) возвращает None, d наивно. & Quot; Если это правильно, то почемуd1 в моем примере говорят, что это наивно?
 10 мая 2012 г., 00:49
Не знаю почему, но объекты datetime.time, созданные с помощью EASTERN_TZ, возвращают None для utcoffset, что затем вызывает ошибку TypeError.
Решение Вопроса

что она озадачена этим, но в интересах краткого ответа я подведу итог здесь.

В соответствии с документами datetime при сравнении двух объектов datetime.time: «Если оба сопоставителя осведомлены и имеют разные атрибуты tzinfo, сопоставления сначала корректируются путем вычитания их смещений UTC (полученных из self.utcoffset ())» & quot;

В приведенном вами примере сравнение выдает ошибку TypeError, потому что EASTERN_TZ.utcoffset () возвращает None. utcoffset - это None, потому что в восточной части США наблюдается переход на летнее время, и поэтому смещение времени от UTC зависит от даты, которая недоступна в datetime.time.

Вы должны использовать объекты datetime.datetime для сравнений между часовыми поясами:

>>> import pytz, datetime
>>> UTC_TZ = pytz.utc
>>> EASTERN_TZ = pytz.timezone('America/New_York')
>>> d1 = datetime.datetime(2012, 1, 1, 10, 0, tzinfo=UTC_TZ)
>>> d2 = datetime.datetime(2012, 1, 1, 10, 0, tzinfo=EASTERN_TZ)
>>> d1 < d2
True
 03 окт. 2012 г., 12:39
Вы не должны использоватьtzinfo параметр для часовых поясов с DST. использованиеEASTERN_TZ.localize(naive_dt, is_dst=None).astimezone(pytz.utc) чтобы получить объект даты и времени для сравнения..astimezone() не требуется, но предпочтительно всегда работать с временем UTC внутри и преобразовывать его в другие часовые пояса только на IO
 07 сент. 2014 г., 04:14
Обратите внимание, что в 3.3 сравнения равенства между наивными и осведомленными экземплярами времени не вызывают TypeError.

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