Как я могу получить дату типа (07.11.2021) из имени даты типа (понедельник, вторник...)

Я разрабатываю проект django и в моем шаблоне пользователь может выбрать день. Как показано на нижней картинке. enter image description here

После 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
Вернуться на верх