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
И основывайте свое сообщение на этих значениях.