Как я могу получить дату типа (07.11.2021) из имени даты типа (понедельник, вторник...)
Я разрабатываю проект django и в моем шаблоне пользователь может выбрать день. Как показано на нижней картинке.
После day select post запрос работает. И в моем views.py я могу получить название дня. Например (понедельник, вторник,...). Используя эти знания, я хочу получить дату этой недели. Например, приходящее значение запроса - среда, и я хочу получить дату среды на этой неделе, например (03.11.2021)
создайте файл utils.py и импортируйте его в ваш views.py и вы можете передать ему строку типа 'Sunday', это даст правильную дату и убедитесь, что первая буква later является заглавной, используя .upper()
перед передачей в функцию.Это просто идея, вы можете сделать ее лучше ).
from datetime import date,timedelta
import calendar
def find_day(week_day):
my_date = date.today()
a = calendar.day_name[my_date.weekday()]
weekdays = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
now = weekdays.index(a)
later = weekdays.index(week_day)
if later > now:
date = my_date - timedelta(days= now - later)
else:
date = my_date - timedelta(days= now - later)
return date
Предположим, у вас есть определенные данные (например, сегодня), и вы хотите узнать дату другого дня недели в пределах той же недели.
Вы можете использовать datetime
и time
, чтобы получить день недели как целое число сегодняшнего дня, вычислить разницу в днях между днем недели, который у вас есть, и тем, на который вы ориентируетесь, и, наконец, применить эту разницу к вашему первоначальному datetime
.
День недели по желанию преобразуется в целое число с помощью strptime()
и пробует все известные строки формата дня недели. Обратите внимание, что tm_wday
, а также weekday()
используют одно и то же соглашение для "понедельник" -> 0 - "воскресенье" -> 6, в то время как форматные коды %w
и %u
используют другие соглашения. Очень важно вычислить разницу с целочисленными днями недели, полученными в соответствии с той же конвенцией. Следовательно, если weekday
задан как целое число, следует использовать соглашение "понедельник" -> 0 - "воскресенье" -> 6.
import datetime
import time
def weekday_as_int(weekday):
weekday = weekday.strip()
result = None
# %a -- Weekday as locale’s abbreviated name.
# %A -- Weekday as locale’s full name.
# %w -- Weekday as a decimal number, where 0 is Sunday and 6 is Saturday.
# %u -- ISO 8601 weekday as a decimal number where 1 is Monday and 7 is Sunday
for fmt in ("%a", "%A", "%w", "%u"):
try:
result = time.strptime(weekday, fmt).tm_wday
except ValueError:
pass
if result is not None:
return result
if not result:
raise ValueError(f'Could not parse `{weekday}` as week day')
def get_date_for_weekday(curr_date, weekday):
if not isinstance(weekday, int):
weekday = weekday_as_int(weekday)
curr_weekday = curr_date.weekday()
delta = weekday - curr_weekday
return curr_date + datetime.timedelta(days=delta)
# datetime.date(2021, 11, 5) is a Friday
get_date_for_weekday(datetime.date(2021, 11, 5), "Monday")
# datetime.date(2021, 11, 1)
get_date_for_weekday(datetime.date(2021, 11, 5), "Friday")
# datetime.date(2021, 11, 5)
get_date_for_weekday(datetime.date(2021, 11, 2), "wed")
# datetime.date(2021, 11, 3)
get_date_for_weekday(datetime.date.today(), "mon")
# datetime.date(2021, 11, 1) # <-- this output only this week