Неожиданное поведение Zoneinfo при переходе на летнее время при добавлении timedeltaaPython

Программы на Python
Ответить
Anonymous
 Неожиданное поведение Zoneinfo при переходе на летнее время при добавлении timedeltaa

Сообщение Anonymous »

Мне кажется, что на предыдущий вопрос не было достаточно ответа: добавление дельты времени к локальному дате и времени, неожиданное поведение при сдвиге на летнее время
Я тестирую обработку даты с учетом часового пояса, используя модуль Zoneinfo стандартной библиотеки Python (Python 3.12.12 и 3.13.7). Я ожидаю, что дата и время рядом с переходом на летнее время правильно отрегулируют смещение UTC после добавления дельты времени. Однако мои тесты относительно перехода на летнее время в Европе/Цюрихе 30 марта 2025 г. не дали результата.
Ожидается, что в этот день Европа/Цюрих перейдет с UTC+1 на UTC+2, пропуская местное время 02:00–02:59.
Вот минимальный воспроизводимый пример:

Код: Выделить всё

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)

self.assertEqual(d.utcoffset(), timedelta(hours=1))
self.assertEqual(later.utcoffset(), timedelta(hours=2))
self.assertEqual(later.hour, 5)

def test_2(self):
d = datetime(2025, 3, 30, 3, 0, 0, tzinfo=ZoneInfo("Europe/Zurich"))
earlier = d-timedelta(seconds=3601)
self.assertEqual(d.utcoffset(), timedelta(hours=2))
self.assertEqual(earlier.utcoffset(), timedelta(hours=1))
self.assertEqual(earlier, datetime(2025, 3, 30, 0, 59, 59, tzinfo=ZoneInfo("Europe/Zurich")))

if __name__ == "__main__":
unittest.main()
Но тесты не проходят:

Код: Выделить всё

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'))
Вывод repr(later) выводит:

Код: Выделить всё

datetime(2025, 3, 30, 4, 0, tzinfo=zoneinfo.ZoneInfo("Europe/Zurich"))
Та же проблема возникает, когда начальная дата и время создается с помощью: Ожидается ли такое поведение? Игнорирует ли datetime + timedelta переходы часовых поясов при использовании Zoneinfo в отличие от того, что я читаю, или я неправильно понимаю, как должна работать арифметика с учетом часовых поясов? Если нет, может ли это быть ошибка tzdata или Zoneinfo? Версия tzdata моей системы: 2022g (macOS) или 2025b (Linux).

Подробнее здесь: https://stackoverflow.com/questions/798 ... timedeltaa
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»