Печать даты и времени в виде pytz.timezone ("Etc / GMT-5") дает неверный результат - PullRequest
0 голосов
/ 23 февраля 2019

Рассмотрим следующий пример, где я беру наивную дату и время, указываю на часовой пояс в UTC, а затем преобразую в UTC-5:

d1 = datetime.datetime(2019,3,7, 7,45)

d2 = pytz.utc.localize(d1)
print(f'UTC  : {d2}')

d3 = d2.astimezone(pytz.timezone('Etc/GMT-5'))
print(f'UTC-5: {d3}')

Вывод:

UTC  : 2019-03-07 07:45:00+00:00
UTC-5: 2019-03-07 12:45:00+05:00

Я бы ожидал, что время UTC-5 будет 02:45, но 5-часовое смещение добавляется к UTC, а не вычитается.

Вопросы:

  • Почему смещение 'Etc/GMT-5' применяется к UTC +5 часов вместо -5 часов?
  • Как преобразовать из UTC до UTC-5?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Вы используете pytz, а не только Python's datetime. Как и dateutil , pytz использует базу данных Olson tz .

База данных Olson tz определяет Etc/GMT+N часовые пояса, которые соответствуют стилю POSIX :

эти имена зон, начинающиеся с "Etc / GMT", имеют знак, обратный стандартному соглашению ISO 8601.В зоне «Etc» зоны к западу от GMT имеют положительный знак, а на востоке - отрицательный знак в своем названии (например, «Etc / GMT-14» на 14 часов больше GMT).


Итак, чтобы преобразовать UTC в часовой пояс со смещением -5, вы можете использовать Etc/GMT+5:

import datetime as DT
import pytz

naive = DT.datetime(2019, 3, 7, 7, 45)
utc = pytz.utc
gmt5 = pytz.timezone('Etc/GMT+5')
print(utc.localize(naive).astimezone(gmt5))

# 2019-03-07 02:45:00-05:00
0 голосов
/ 23 февраля 2019

Очевидно, что в системах стиля posix вы должны использовать обратную величину смещения часового пояса.Это означает, что если вы хотите получить -5, вы должны использовать GMT+5.

d3 = d2.astimezone(pytz.timezone('Etc/GMT+5'))

печатает

UTC-5: 2019-03-07 02:45:00-05:00

В противном случае вы должны передать posix_offset как true.Это в документации dateutil;

Существует одно заметное исключение, которое заключается в том, что часовые пояса в стиле POSIX используют инвертированный формат смещения, поэтому обычно GMT + 3 будет анализироваться как смещение на 3 часа позже GMT,Объект часового пояса tzstr будет анализировать это как смещение на 3 часа перед GMT.Если вы хотите сохранить поведение POSIX, передайте значение True в posix_offset.

https://dateutil.readthedocs.io/en/stable/tz.html#dateutil.tz.tzstr

...