Сложность с isocalendar
заключается в том, что на самом деле он не считает день месяца. Поэтому вам нужно перевести обратно, чтобы получить это. strptime
может помочь:
year, week, dow = datetime.today().isocalendar()
result = [datetime.strptime(str(year) + "-" + str(week-1) + "-" + str(x), "%Y-%W-%w").day for x in range(1,7)]
Здесь мы создаем строку, которую striptime
может понять, начиная с недели назад (для учета отсчета от 0 до 1) и начиная с начала недели (понедельник, который равен 1
), и конструируя дату и время для каждого день вперед 7 дней.
Играя с week
между этими двумя утверждениями (добавляя или удаляя недели, чтобы получить месячные перерывы), мы видим, что это работает:
>>> year, week, dow = datetime.today().isocalendar()
>>> result = [datetime.strptime(str(year) + "-" + str(week-1) + "-" + str(x), "%Y-%W-%w").day for x in range(1,7)]
>>> result
[21, 22, 23, 24, 25, 26]
>>> year, week, dow = datetime.today().isocalendar()
>>> week = week + 1
>>> result = [datetime.strptime(str(year) + "-" + str(week-1) + "-" + str(x), "%Y-%W-%w").day for x in range(1,7)]
>>> result
[28, 29, 30, 1, 2, 3]
Теперь, чтобы решить две очень серьезные проблемы, поднятые в комментариях, мы должны немного изменить ситуацию:
year, week, dow = datetime.today().isocalendar()
week_start = datetime.strptime(str(year) + "-" + str(week-2) + "-0", "%Y-%W-%w")
result = [(week_start + timedelta(days=x)).day for x in range(0,7)]
Это использует timedelta
для увеличения. Чтобы это работало, мы должны выполнить резервное копирование через неделю (отсюда -2
вместо -1
). Затем for comprehension добавляет все большую временную дельту по мере того, как мы повторяем неделю:
>>> year, week, dow = datetime.today().isocalendar()
>>> week_start = datetime.strptime(str(year) + "-" + str(week-2) + "-0", "%Y-%W-%w")
>>> result = [(week_start + timedelta(days=x)).day for x in range(0,7)]
>>> result
[20, 21, 22, 23, 24, 25, 26]
>>> year, week, dow = datetime.today().isocalendar()
>>> week = week + 1
>>> week_start = datetime.strptime(str(year) + "-" + str(week-2) + "-0", "%Y-%W-%w")
>>> result = [(week_start + timedelta(days=x)).day for x in range(0,7)]
>>> result
[27, 28, 29, 30, 1, 2, 3]
person
Nathaniel Ford
schedule
21.09.2015