При переводе часов на зимнее время возникают случаи неоднозначного времени: один и тот же час может встречаться дважды.
Например, в Берлине переход с летнего времени на зимнее в 2020 году пройдет 25 октября 2020 года в 3 часа ночи (Oct 25 at 3:00 am), и после перехода часы снова будут показывать 2 часа ночи, если использовать время 2-30 то возникнет проблема неоднозначности: это время до перевода или после.
dateutil позволяет воспользоваться методом is_ambiguous (или dateutil.tz.datetime_ambiguous(dt, tz=None)) для проверки таких меток.
Пример
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import dateutil.tz import datetime local_tz = dateutil.tz.gettz("Europe/Berlin") confusing = datetime.datetime(2020, 10, 25, 2, 30, tzinfo=local_tz) print(f'Is ambiguous: {local_tz.is_ambiguous(confusing)}') # Is ambiguous: True normal = datetime.datetime(2020, 10, 26, 2, 30, tzinfo=local_tz) print(f'Is ambiguous: {local_tz.is_ambiguous(normal)}') # Is ambiguous: False |
Начиная с python3.6 так же можно руками указать на какой стороне перехода находится временная метка с помощью атрибута fold для datetime
Пример
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import dateutil.tz import datetime local_tz = dateutil.tz.gettz("Europe/Berlin") confusing = datetime.datetime(2020, 10, 25, 2, 30, tzinfo=local_tz) print(f'Confusing datetime: {confusing}') # Confusing datetime: 2020-10-25 02:30:00+02:00 before_clock_change = confusing.replace(fold=0) print(f'Before clock change: {before_clock_change}') # Before clock change: 2020-10-25 02:30:00+02:00 after_clock_change = confusing.replace(fold=1) print(f'After clock change: {after_clock_change}') # After clock change: 2020-10-25 02:30:00+01:00 |
fold = 0 – помечает метку как до перевода времени, отсюда в примере остается +02:00
fold = 1 – помечает метку как после перевода времени, отсюда в примере меняется на +01:00