Как узнать ближайшее существующее локальное время?
С помощью 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 шт):
В общем, предлагаю взять список транзитов:
list(zip(tz._utc_transition_times, tz._transition_info))
При выпадении эксепшена на localize нужно будет пробежаться по этому списку двоичным поиском и найти, в какой элемент этого списка ваш datetime попал.
После этого определить, что ближе к вашему datetime - начало этого диапазона или конец.
Что ближе - то и результат.
P.S. zoneinfo я не смотрел.