Относительно того, как можно сгенерировать таблицу критических времен DST:
Это генерирует дату и время, когда наступает переход на летнее время:
import datetime as dt
import time
import itertools
def fall_dst_boundaries(date=None):
'''
Generates the datetimes when Daylight Savings Time "fall back" occurs after date.
'''
if date is None:
date=dt.datetime.now()
timestamp=time.mktime(date.timetuple())//3600 * 3600
previous_date=dt.datetime.fromtimestamp(timestamp)
while True:
timestamp+=3600
date=dt.datetime.fromtimestamp(timestamp)
if date==previous_date:
yield date
previous_date=date
for date in itertools.islice(fall_dst_boundaries(dt.datetime(1980,1,1)),15):
print(date)
выход:
1980-10-26 01:00:00
1981-10-25 01:00:00
1982-10-31 01:00:00
1983-10-30 01:00:00
1984-10-28 01:00:00
1985-10-27 01:00:00
1986-10-26 01:00:00
1987-10-25 01:00:00
1988-10-30 01:00:00
1989-10-29 01:00:00
1990-10-28 01:00:00
1991-10-27 01:00:00
1992-10-25 01:00:00
1993-10-31 01:00:00
1994-10-30 01:00:00
PS.Летнее время заканчивается в 2 часа ночи, но час повторения - 1 час ночи.
Чтобы сгенерировать даты и время «возврата назад» и «возврата вперед», вы можете использовать что-то вроде этого:
def DST_boundaries(date=None):
'''
Generates the datetimes when Daylight Savings Time "fall back" or "spring
forward" occurs after date.
'''
if date is None:
date=dt.datetime.now()
timestamp=time.mktime(date.timetuple())//3600 * 3600 + 3599
previous_date=dt.datetime.fromtimestamp(timestamp)
while True:
timestamp+=3600
date=dt.datetime.fromtimestamp(timestamp)
if date==previous_date or date.hour-previous_date.hour>1:
yield previous_date
previous_date=date