2017-02-04 2 views
1

Нам нужно найти начало недели (Задан), учитывая эти две переменные:Более простой способ найти начало недели для любого старта день

  1. now - текущий DateTime
  2. START_DAY - день недели (0-6, где 0 является понедельником и 6 является воскресеньем), что мы считаем «начало недели»

мы можем использовать цикл, но это кажется слишком много шагов для простая проблема:

week_start = datetime(now.year, now.month, now.day) 
while week_start.weekday() != START_DAY: 
    week_start = week_start - timedelta(days=1) 

Это очень легко, если START_DAY всегда 0 (понедельник):

week_start = datetime(now.year, now.month, now.day) - timedelta(days=now.weekday()) 

Или всегда 6 (воскресенье):

week_start = datetime(now.year, now.month, now.day) - timedelta(days=(0 if now.weekday() == START_DAY else now.weekday() + 1)) 

Что представляет собой простой метод расчета начало недели для любого значения START_DAY?

ответ

3

Число дней между START_DAY и now составляет now.weekday() - START_DAY. Однако, если сегодня до START_DAY (например, если сегодня среда и START_DATE равно 6 = воскресенье), это число будет отрицательным, и вычитание из сегодняшнего дня даст вам дату в будущем.

Так как вы, вероятно, не хотите, что вам нужно разность по модулю 7:

week_start = now.date() - timedelta(days=(now.weekday() - START_DAY) % 7) 

Примеры:

>>> from datetime import datetime, timedelta 
>>> now = datetime(2017, 2, 1) 
>>> print(now.strftime("%d/%m/%y (%a)")) 
01/02/17 (Wed) 
>>> for START_DAY in range(7): 
...  start_week = now.date() - timedelta(days=(now.weekday() - START_DAY) % 7) 
...  print(start_week.strftime("%d/%m/%y (%a)")) 
... 
30/01/17 (Mon) 
31/01/17 (Tue) 
01/02/17 (Wed) 
26/01/17 (Thu) 
27/01/17 (Fri) 
28/01/17 (Sat) 
29/01/17 (Sun) 
Смежные вопросы