#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. Пожалуйста, запустите свой код, чтобы убедиться, что он, вероятно, неверен.