Мне кажется, что на предыдущий вопрос не было достаточно ответа: добавление дельты времени к локальному дате и времени, неожиданное поведение при сдвиге на летнее время
Я тестирую обработку даты с учетом часового пояса, используя модуль Zoneinfo стандартной библиотеки Python (Python 3.12.12 и 3.13.7). Я ожидаю, что дата и время рядом с переходом на летнее время правильно отрегулируют смещение UTC после добавления дельты времени. Однако мои тесты относительно перехода на летнее время в Европе/Цюрихе 30 марта 2025 г. не дали результата.
Ожидается, что в этот день Европа/Цюрих перейдет с UTC+1 на UTC+2, пропуская местное время 02:00–02:59.
Вот минимальный воспроизводимый пример:
d = datetime(2025, 3, 30, 1, 59, 59).astimezone(ZoneInfo("Europe/Zurich"))
Ожидается ли такое поведение? Игнорирует ли datetime + timedelta переходы часовых поясов при использовании Zoneinfo в отличие от того, что я читаю, или я неправильно понимаю, как должна работать арифметика с учетом часовых поясов? Если нет, может ли это быть ошибка tzdata или Zoneinfo? Версия tzdata моей системы: 2022g (macOS) или 2025b (Linux).
Мне кажется, что на предыдущий вопрос не было достаточно ответа: добавление дельты времени к локальному дате и времени, неожиданное поведение при сдвиге на летнее время Я тестирую обработку даты с учетом часового пояса, используя модуль Zoneinfo стандартной библиотеки Python (Python 3.12.12 и 3.13.7). Я ожидаю, что дата и время рядом с переходом на летнее время правильно отрегулируют смещение UTC после добавления дельты времени. Однако мои тесты относительно перехода на летнее время в Европе/Цюрихе 30 марта 2025 г. не дали результата. Ожидается, что в этот день Европа/Цюрих перейдет с UTC+1 на UTC+2, пропуская местное время 02:00–02:59. Вот минимальный воспроизводимый пример: [code]import unittest from datetime import datetime, timedelta from zoneinfo import ZoneInfo
class TestZoneInfo(unittest.TestCase): def test_1(self): d = datetime(2025, 3, 30, 1, 59, 59, tzinfo=ZoneInfo("Europe/Zurich")) later = d + timedelta(seconds=7201)
if __name__ == "__main__": unittest.main() [/code] Но тесты не проходят: [code]AssertionError: 4 != 5 AssertionError: datet[20 chars], 30, 1, 59, 59, tzinfo=zoneinfo.ZoneInfo(key='Europe/Zurich')) != datet[20 chars], 30, 0, 59, 59, tzinfo=zoneinfo.ZoneInfo(key='Europe/Zurich')) [/code] Вывод repr(later) выводит: [code]datetime(2025, 3, 30, 4, 0, tzinfo=zoneinfo.ZoneInfo("Europe/Zurich")) [/code] Та же проблема возникает, когда начальная дата и время создается с помощью: [list] [*][code]d = datetime.fromisoformat("2025-3-30T01:59:59+01:00")[/code] [*][code]d = datetime.fromisoformat("2025-3-30T01:59:59").replace(ZoneInfo("Europe/Zurich"))[/code] [*][code]d = datetime(2025, 3, 30, 1, 59, 59).astimezone(ZoneInfo("Europe/Zurich"))[/code] [/list] Ожидается ли такое поведение? Игнорирует ли datetime + timedelta переходы часовых поясов при использовании Zoneinfo в отличие от того, что я читаю, или я неправильно понимаю, как должна работать арифметика с учетом часовых поясов? Если нет, может ли это быть ошибка tzdata или Zoneinfo? Версия tzdata моей системы: 2022g (macOS) или 2025b (Linux).