Как добавить часовой пояс в наивный экземпляр datetime в python

У меня есть datetime, который не имеет информации о часовом поясе. Теперь я получаю информацию о часовом поясе и хочу добавить часовой пояс в существующий экземпляр datetime, как я могу это сделать?

d = datetime.datetime.now()
tz = pytz.timezone('Asia/Taipei')

Как добавить информацию о часовом поясе tz в datetime a

Ответ 1

Используйте tz.localize(d) для локализации экземпляра. Из документации:

Первый заключается в использовании метода localize(), предоставляемого библиотекой pytz. Это используется для локализации наивного datetime (datetime без информации о часовом поясе):

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
>>> print(loc_dt.strftime(fmt))
2002-10-27 06:00:00 EST-0500

Если вы не используете tz.localize(), но используете datetime.replace(), скорее всего, используется историческое смещение; tz.localize() выберет правильное смещение, действующее на заданную дату. Например, даты начала и окончания летнего времени в Восточном часовом поясе США со временем менялись.

Когда вы пытаетесь локализовать значение datetime, которое является неоднозначным, поскольку оно охватывает переходный период от летнего времени до зимы или наоборот, с часовым поясом будет проконсультироваться, чтобы увидеть, должен ли результирующий объект datetime иметь .dst() вернуть True или Ложь. Вы можете переопределить значение по умолчанию для часового пояса с помощью аргумента is_dst ключевого слова для .localize():

dt = tz.localize(naive, is_dst=True)

или вообще отключите выбор, установив is_dst=None. В этом случае или в редких случаях по умолчанию для часового пояса не задано значение, двусмысленное значение datetime приведет к возникновению исключения AmbiguousTimeError. Флаг is_dst используется только для значений неопределенного времени, которые неоднозначны и в противном случае игнорируются.

Чтобы вернуться в другую сторону, верните объект, ориентированный на часовой пояс, на наивный объект, используйте .replace(tzinfo=None):

naivedt = awaredt.replace(tzinfo=None)

Ответ 2

Если вы знаете, что ваше исходное datetime было "измерено" в часовом поясе, который вы пытаетесь добавить к нему, вы могли бы (но, вероятно, не должны) использовать replace, а не localize.

# d = datetime.datetime.now()
# tz = pytz.timezone('Asia/Taipei')
d = d.replace(tzinfo=tz)

Я могу представить 2 раза, когда это может иметь смысл (второй со мной произошел):

  • Язык вашего сервера настроен на неправильный часовой пояс, и вы пытаетесь исправить экземпляр datetime, сообщив об этом неправильном часовом поясе (и предположительно позже локализируя его в "правильный" часовой пояс, чтобы значения теперь() соответствуют другим моделям, с которыми вы сравниваете это (ваши часы, возможно)
  • Вы хотите "пометить" экземпляр time ( НЕ a datetime) с атрибутом часового пояса (tzinfo), чтобы атрибут можно было использовать позже, чтобы сформировать полный datetime экземпляр.