Оповещение за неделю до перехода на летнее время в Python

python

#python

Вопрос:

Предыстория

Я пытаюсь написать код на Python, который печатает какое-либо сообщение за 7 дней до перехода на дневное освещение. В США Переход на летнее время в Соединенных Штатах — это практика перевода часов на один час вперед, когда в течение дня в США больше дневного света. Переход на летнее время начинается во второе воскресенье марта и заканчивается в первое воскресенье ноября

Решение пока

 from datetime import datetime   

def is_it_oct_31():
    today_date = datetime.today()
    return today_date.day == 31 and today_date.month == 10

def is_it_march_1():
    today_date = datetime.today()
    return today_date.day == 1 and today_date.month == 3


def check_if_it_is_daylight_saving():
    if is_it_oct_31():
        print("Time to set the clock 1 hour behind soon")
    if is_it_march_1():
        print("Time to set the clock 1 hour forward soon")
 

Идея моего подхода проста: я пытаюсь проверять даты за несколько дней до события сохранения дневного света. Однако я не уверен, смогу ли я написать код, который всегда предупреждал бы меня о переходе на летнее время за «7» дней до события. Любые мысли будут оценены.

Ответ №1:

Насколько я могу судить, ваш код имеет фундаментальный недостаток: он предполагает, что переход на летнее время происходит в одну и ту же дату каждый год, что неверно. Если посмотреть на страницу Википедии, она начинается во 2-е воскресенье марта и заканчивается в первое воскресенье ноября.

На вашем месте я бы изменил две функции таким образом, чтобы они учитывали этот аспект. И если вы хотите получить предупреждение за неделю до перехода на летнее время, я думаю, вам нужно оставить скрипт Python запущенным при запуске. Он проверяет, что вы хотите, каждый раз при включении компьютера.

Ответ №2:

Создайте функцию, которая находит n-е воскресенье месяца:

 from datetime import datetime, timedelta

def get_sunday(month, nth):
    # First day of month
    month = datetime(datetime.today().year, month, 1)
    # Move to first Sunday (Sunday is 6th weekday)
    month  = timedelta(days=6-month.weekday())
    # Move to nth Sunday
    month  = timedelta(days=(nth-1)*7)
    # You can combine the last 2 lines as
    # month  = timedelta(days=((nth-1)*7)   (6-month.weekday()))
    return month  
 

Затем получите начало и конец летнего времени

 dst_start = get_sunday(3, 2)
dst_end = get_sunday(11, 1)
 

Затем вычислите количество дней для каждого

 days_until_dst_start = (dst_start - datetime.today()).days
days_until_dst_end = (dst_end - datetime.today()).days
 

И основывайте свое сообщение на этих значениях.