Добавление timedelta к локальной дате и времени, неожиданное поведение при смене летнего времени.Python

Программы на Python
Ответить
Anonymous
 Добавление timedelta к локальной дате и времени, неожиданное поведение при смене летнего времени.

Сообщение Anonymous »

Я только что столкнулся с этим удивительным поведением с датами Python при создании даты и времени в зависимости от смены летнего времени.
Добавление дельты времени к локальной дате и времени может не добавить ожидаемого количества времени.

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

import datetime as dt
from zoneinfo import ZoneInfo

# Midnight
d0 = dt.datetime(2020, 3, 29, 0, 0, tzinfo=ZoneInfo("Europe/Paris"))
# datetime.datetime(2020, 3, 29, 0, 0, tzinfo=zoneinfo.ZoneInfo(key='Europe/Paris'))
d0.isoformat()
# '2020-03-29T00:00:00+01:00'

# Before DST shift
d1 = d0 + dt.timedelta(hours=2)
# datetime.datetime(2020, 3, 29, 2, 0, tzinfo=zoneinfo.ZoneInfo(key='Europe/Paris'))
d1.isoformat()
# '2020-03-29T02:00:00+01:00'

# After DST shift
d2 = d0 + dt.timedelta(hours=3)
# datetime.datetime(2020, 3, 29, 3, 0, tzinfo=zoneinfo.ZoneInfo(key='Europe/Paris'))
d2.isoformat()
# '2020-03-29T03:00:00+02:00'

# Convert to UCT
d1u = d1.astimezone(dt.timezone.utc)
# datetime.datetime(2020, 3, 29, 1, 0, tzinfo=datetime.timezone.utc)
d2u = d2.astimezone(dt.timezone.utc)
# datetime.datetime(2020, 3, 29, 1, 0, tzinfo=datetime.timezone.utc)

# Compute timedeltas
d2 - d1
# datetime.timedelta(seconds=3600)
d2u - d1u
# datetime.timedelta(0)
Я согласен, что d1 и d2 одинаковы, но разве d2 не должно быть «2020-03-29T04:00:00+02:00», тогда?

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

d3 = d0 + dt.timedelta(hours=4)
# datetime.datetime(2020, 3, 29, 4, 0, tzinfo=zoneinfo.ZoneInfo(key='Europe/Paris'))
Очевидно, что при добавлении дельты времени (например, 3 часов) к локальной дате и времени она добавляется независимо от часового пояса, и разница между двумя датами и временем (в режиме реального времени/UTC) не гарантированно будет этой дельтой времени (т. е. она может составлять 2 часа из-за летнего времени). Это своего рода ловушка.
Каково обоснование? Это где-то задокументировано?

Подробнее здесь: https://stackoverflow.com/questions/728 ... -dst-shift
Ответить

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

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

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

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

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