Как узнать ближайшее существующее локальное время?

С помощью pytz я могу проверить, существует ли указанное локальное время в указанном часовом поясе:

tz = pytz.timezone("Europe/Moscow")
tz.localize(datetime(2011, 3, 27, 2, 30, 0), is_dst=None)
# pytz.exceptions.NonExistentTimeError: 2011-03-27 02:30:00

После того, как я узнал, что интересующее меня время не существует, я хочу узнать, какое ближайшее локальное время существует. Другими словами, я хочу получить один из двух таких объектов (а лучше оба сразу):

datetime(2011, 3, 27, 1, 59, 59, 999999, tzinfo=<DstTzInfo 'Europe/Moscow' MSK+3:00:00 STD>)
datetime(2011, 3, 27, 3, 0, 0, 0, tzinfo=<DstTzInfo 'Europe/Moscow' MSK+4:00:00 STD>)

Есть ли способ более эффективный, чем ручной перебор дат по минутам?)

(В принципе использование модуля zoneinfo меня тоже устроит, но в его документации я пока что не обнаружил, как сделать нужные мне штуки)


Ответы (1 шт):

Автор решения: CrazyElf

В общем, предлагаю взять список транзитов:

list(zip(tz._utc_transition_times, tz._transition_info))

При выпадении эксепшена на localize нужно будет пробежаться по этому списку двоичным поиском и найти, в какой элемент этого списка ваш datetime попал.

После этого определить, что ближе к вашему datetime - начало этого диапазона или конец.

Что ближе - то и результат.

P.S. zoneinfo я не смотрел.

→ Ссылка