Python zoneinfo и fold: как различать повторяющееся местное время

Python zoneinfo и fold: как различать повторяющееся местное время
Содержание статьи

Если местные часы повторились при переводе времени, одной даты и времени недостаточно, чтобы выбрать момент. В Python ZoneInfo задаёт часовой пояс, а fold помогает различить два варианта повторяющегося часа. На Mentoring.digital разберём это на небольшом примере без привязки к текущему расписанию пользователя.

Сначала определите, что именно хранит значение

Строка «01:00» может означать время на местных часах, а может быть частью точного момента с известным смещением. Для журнала событий обычно нужен однозначный момент. Для будущей встречи может быть важно сохранить ещё и название зоны, в которой человек выбрал время.

Представьте форму бронирования: человек ввёл дату и час, а сервер должен создать напоминание. До записи нужно решить, откуда берётся зона и как интерфейс обрабатывает неоднозначный выбор. Молчаливое использование часового пояса сервера не является правилом предметной области.

Два значения одного местного часа

from datetime import datetime, timezone
from zoneinfo import ZoneInfo

zone = ZoneInfo("America/Los_Angeles")
first = datetime(2020, 11, 1, 1, 0, tzinfo=zone, fold=0)
second = first.replace(fold=1)

print(first.astimezone(timezone.utc))
print(second.astimezone(timezone.utc))

В этом историческом примере первое значение переводится в 08:00 UTC, второе в 09:00 UTC. Местные цифры одинаковы, но смещения различаются. fold=0 выбирает вариант до перехода, fold=1 после него.

Проверяйте различие через перевод в UTC, а не только сравнением напечатанного часа. Для теста полезно проверить обе строки UTC и оба смещения. Так ожидаемое поведение останется понятным человеку, который позже прочитает тест.

Не путайте присоединение зоны и преобразование

replace(tzinfo=...) присоединяет информацию о зоне, а astimezone(...) преобразует представление известного момента. Если вход уже содержит смещение, сначала сохраните его смысл. Простая замена tzinfo может описать другой момент.

Практический порядок для входного API: проверить формат, определить, является ли время местным или уже однозначным, затем применить согласованное правило. Если неоднозначность требует выбора пользователя, верните понятное сообщение вместо случайного решения по умолчанию.

Откуда берутся правила зоны

zoneinfo использует системную базу IANA либо пакет tzdata. На Windows системной базы может не быть. Для переносимого проекта зависимость нужно учитывать явно; при отсутствии данных возникает ZoneInfoNotFoundError.

Запишите в диагностике среду и источник данных. Ошибка отсутствующей зоны отличается от неверной интерпретации времени: первая требует доступной базы, вторая исправления логики. Не заменяйте неизвестную зону на UTC без согласованного правила, иначе успешный запуск скроет неправильное расписание.

Как проверить свою реализацию

  • Обычное время переводится в ожидаемый момент.
  • Оба варианта повторяющегося часа различаются в UTC.
  • Вход без зоны не принимается молча за время сервера.
  • Неизвестное имя зоны даёт понятную ошибку.

fold не заменяет проверку формы и бизнес-правила выбора времени. Если нужно разобраться в обработке дат и тестах, можно обратиться к ментору по Python. Начните с одного воспроизводимого случая, а затем добавляйте правила своего приложения.

Похожие статьи по данной теме