pytz дает неправильное смещение часового пояса для 'Африка / Хартум' - PullRequest
0 голосов
/ 21 июня 2020

У меня есть следующий код

import datetime
import pytz

tz_offset = datetime.datetime.now(pytz.timezone('Africa/Khartoum' or 'GMT')).strftime('%z')
print(tz_offset)

Ожидаемый результат - «+0200», но он дает «+0300».

Поскольку pytz получает информацию от IANA, я связался с ними и они сказали, что это правильно установлено в их базе данных. Вот их ответ по электронной почте:

19.06.20 10:40 Убай Абдельгадир написал:

часовой пояс Хартума +2 с 1 / ноября / 2017 г. Я думаю, что это неверно в базе данных IANA:

Zone Africa/Khartoum 2:10:08 - LMT 1931
    2:00 Sudan CA%sT 2000 Jan 15 12:00
    3:00 - EAT 2017 Nov  1
    2:00 - CAT

В этой записи данных говорится, что в Африке / Хартуме с 1 ноября 2017 года было +02, поэтому, похоже, он согласен с вашим утверждением, что Хартум часовой пояс +2 с 1 ноября 2017 года.

Edit

Я решил это, обновив версию pytz, это была версия 2016.7, которая устарела для моего case (изменение произошло в 2017 году)

1 Ответ

1 голос
/ 21 июня 2020

Я не могу воспроизвести пример для datetime.datetime.now. pytz также показывает правильное изменение смещения UT C в 2017 году для часового пояса «Африка / Хартум». Однако вам необходимо использовать метод localize (см., Например, здесь ).

import datetime
import pytz

tz = pytz.timezone('Africa/Khartoum')

# correct UTC offset for "now":
tz_offset = tz.localize(datetime.datetime.now()).strftime('%z')
print(tz_offset)
# +0200

# also correct UTC offset around 1st Nov 2017:
tz_offset = tz.localize(datetime.datetime(2017,10,31)).strftime('%z')
print(tz_offset)
# +0300
tz_offset = tz.localize(datetime.datetime(2017,11,1)).strftime('%z')
print(tz_offset)
# +0200

Если вы не используете localize, вы получите только среднее местное время . С dateutil вам не придется локализовать и можно напрямую указать часовой пояс:

import dateutil
tz = dateutil.tz.gettz('Africa/Khartoum')
tz_offset = datetime.datetime(2017,10,31, tzinfo=tz).strftime('%z')
print(tz_offset)
# +0300
tz_offset = datetime.datetime(2017,11,1, tzinfo=tz).strftime('%z')
print(tz_offset)
# +0200
...