Преобразование известного часового пояса в часовой пояс UIC с помощью zoneinfo (миграция из pytz)

#python #datetime #timezone #zoneinfo

#python #дата и время #Часовой пояс #zoneinfo

Вопрос:

Я использую Python 3.8, поэтому я использую https://pypi.org/project/backports.zoneinfo / чтобы получить zoneinfo. Django не одобряет использование pytz , поэтому я выполняю изменение с pytz на zoneinfo

С помощью pytz можно было бы сделать from pytz import UTC . Документация python получает его из datetime.timezone.utc' (and this does not have a метода localize`).

Как выполнить эквивалент этого: pytz.UTC.localize(my_datetime, is_dst=None) с помощью zoneinfo?

Комментарии:

1. Может быть, устаревшая прокладка поможет вам начать? pytz-deprecation-shim.readthedocs.io/en/latest (кроме того, с UTC вам не нужно выполнять локализацию, даже с помощью pytz. Вы можете просто установить tzinfo напрямую)

2. pytz: The Fastest Footgun in the West … так смешно =)

Ответ №1:

pytz.localize предназначен только для наивных дат (дата-время без информации о часовом поясе), поэтому

 import datetime
import pytz
my_datetime = datetime.datetime(2021, 10, 31, 2)
pytz.UTC.localize(my_datetime, is_dst=None)
# -> datetime.datetime(2021, 10, 31, 2, 0, tzinfo=<UTC>)
 

Соответствующая конструкция без pytz

 my_datetime.replace(tzinfo=datetime.timezone.utc)
# -> datetime.datetime(2021, 10, 31, 2, 0, tzinfo=datetime.timezone.utc)
 

Примечание: не используйте my_datetime.astimezone(timezone.utc) , поскольку при этом предполагается, что my_datetime представлен в системном часовом поясе.

Ответ №2:

Ссылка @MrFuppes предоставляет: https://blog.ganssle.io/articles/2018/03/pytz-fastest-footgun.html объясняет, что pytz с его методом локализации не был стандартным. Теперь с zone info мы можем использовать простой стандартный API, не беспокоясь о том, чтобы выстрелить себе в ногу:

pytz.UTC.localize(my_datetime, is_dst=None)

становится

 my_datetime.astimezone(timezone.utc)
 

И арифметика дат теперь работает даже при отсутствии времени UTC.

Комментарии:

1. Пожалуйста, запустите свой код, чтобы убедиться, что он, вероятно, неверен.