Как проверить, назначена ли дата на следующую неделю, python

#python #date #datetime

Вопрос:

В принципе, я пытаюсь проверить, будет ли дата, например, 2021-07-08, на следующей неделе, или на следующей неделе, или ни на той, ни на другой.

 #I can call the start and end dates of the current week

start = tday - timedelta(days=tday.weekday())
end = start   timedelta(days=6)
print("Today: "   str(tday))
print("Start: "   str(start))
print("End: "   str(end))

# and I can get the current week number. 

curr_week = datetime.date.today().strftime("%V")
print(curr_week)
 

Есть ли лучший способ, чем получить список дат в curr_week 1, а затем проверить, есть ли дата в этом списке?
Большое спасибо

Комментарии:

1. Я откатил правку, которая удалила ваш код. Вы действительно не хотите публиковать подобный вопрос без демонстрации того, где вы находитесь с вашими собственными усилиями по кодированию.

2. Немного «банально», но int(datetime(2021, 8, 17).strftime("%V")) - int(datetime.now().strftime("%V")) == 1 проверяет, будет ли 2021-08-17 это на следующей неделе с сегодняшнего дня.

3. Вы start заканчиваете в нужный день, но в какое-то случайное время в течение этого дня. Я бы нашел начало этого дня и просто добавил timedelta(days=7) бы к нему последовательно, чтобы найти начало следующей недели и следующей после этого.

4. вместо timedelta взгляните на isocalendar — вы можете легко получить номер недели любой даты с помощью этого метода.

Ответ №1:

ОБЩИЙ ОТВЕТ

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

Поэтому найдите номер следующей недели и сравните с ним номер недели, которую вы хотите сверить.

 import datetime

# Date to check in date format:
check_date = datetime.datetime.strptime("2021-09-08", "%Y-%d-%m").date()

# Current week number:
curr_week = datetime.date.today().strftime("%V")
# number of next week
next_week = (datetime.date.today() datetime.timedelta(weeks=1)).strftime("%V")
# number of the week after that
week_after_next_week = (datetime.date.today() datetime.timedelta(weeks=2)).strftime("%V")


# Compare week numbers of next weeks to the week number of the date to check:
if next_week == check_date.strftime("%V"):
    # Date is within next week, put code here
    pass
elif week_after_next_week == check_date.strftime("%V"):
    # Date is the week after next week, put code here
    pass

 

СТАРЫЙ ОТВЕТ

Это приводит к путанице с изменениями года, и по модулю это не исправляется, потому что есть годы с 53 неделями.

Вы можете сравнить номера недель, преобразовав их в целые числа. Вам не нужно создавать список всех дат в течение следующей недели.

 import datetime

# Date to check in date format:
check_date = datetime.datetime.strptime("2021-07-08", "%Y-%d-%m").date()

# Current week number, make it modulo so that the last week is week 0:
curr_week = int(datetime.date.today().strftime("%V"))

# Compare week numbers:
if curr_week == (int(check_date.strftime("%V"))-1):
    # Date is within next week, put code here
    pass
elif curr_week == (int(check_date.strftime("%V"))-2):
    # Date is the week after next week, put code here
    pass
 

Комментарии:

1. в этом гораздо больше смысла, спасибо, приятель. Почему -1 и -2? Почему это так работает?

2. Если дата назначена на следующую неделю, ее номер недели будет на 1 больше, чем номер текущей недели, а если на следующей неделе, то ее номер будет на 2 больше. Теперь, когда я думаю об этом, это вызовет проблемы примерно в конце года, когда номера недель сбросятся, позвольте мне внести правку.

3. что ты изменил?

4. Я понял, что это стало сложнее, сделав это простым способом, поэтому только что добавил более общий ответ. Это работает немного по-другому, но должно содержать крайние случаи.

Ответ №2:

Вы можете указать дату, которую хотите проверить, в режиме времени, а затем сравнить номера недель.

 # date you want to check
date = datetime.datetime.strptime("2021-07-08","%Y-%m-%d")

# current date
tday = datetime.date.today()

# compare the weeks
print(date.strftime("%V"))
print(tday.strftime("%V"))

27
32
 

Ответ №3:

[см. Ответ Альфреда]

Вы можете получить номер недели непосредственно в виде целого числа из IsoCalendarDate представления каждой даты.

 from datetime import datetime
date_format = '%Y-%m-%d'
t_now = datetime.strptime('2021-08-11', date_format)
target_date = datetime.strptime('2021-08-18', date_format)
 

Комментарии:

1. Это плохо согласуется с границами года, поэтому ответ Альфреда работает лучше всего. Я должен был помнить, что следует избегать ручной реализации арифметики на основе даты, имея в виду видео Тома Скотта здесь: youtube.com/watch?v=-5wpm-gesOY

Ответ №4:

Просто используя сравнение даты и времени:

 from datetime import datetime, timedelta


def in_next_week(date):
    """ -1: before; 0: in; 1: after next week;"""
    today = datetime.today()
    this_monday = today.date() - timedelta(today.weekday())
    start = this_monday   timedelta(weeks=1)
    end = this_monday   timedelta(weeks=2)
    return -1 if date < start else 0 if date < end else 1
 

Тестовые примеры:

 for i in range(14):
    dt = datetime.today().date()   timedelta(days=i)
    print(dt, in_next_week(dt))