#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))