2013-04-02 3 views
2

Я использую «datetime», и мне трудно понять, как захватить дату в формате «% Y-% M-% d» по дням недели. Например:Найдите следующую дату по дням недели

С сегодняшнего дня 2013-04-01 (понедельник), какой код будет захватывать следующий вторник или четверг? (выпуск должен быть 2013-04-02 - вторник)

Или, если дата 2013-04-02, вторник, какой код будет захватывать следующий пн, ср или пт? (Выход должен быть 2013-04-03 - На следующий день или среда)

Спасибо,

+0

Это не связано с Python или его даты и времени модулей , Вам нужно написать алгоритм, который вычисляет это. – wRAR

+0

Благодарим за то, что вы указали мне метод weekday(). Вот что мне нужно! –

ответ

3

Это работает:

import datetime as dt 

dow={d:i for i,d in 
     enumerate('Mon,Tue,Wed,Thu,Fri,Sat,Sun'.split(','))} 

def next_dow(d,day): 
    while d.weekday()!=day: 
     d+=dt.timedelta(1) 

    return d 

d1=min(next_dow(dt.datetime(2013,4,1),day) 
       for day in (dow['Tue'],dow['Thu'])) 
d2=min(next_dow(dt.datetime(2013,4,2),day) 
       for day in (dow['Mon'],dow['Wed'],dow['Fri'])) 

for d in d1,d2: 
    print d.strftime('%Y-%m-%d') 

Или (возможно, лучше, но менее общее):

def next_dow(d,days): 
    while d.weekday() not in days: 
     d+=dt.timedelta(1) 

    return d 

d1=next_dow(dt.datetime(2013,4,1),(dow['Tue'],dow['Thu'])) 
d2=next_dow(dt.datetime(2013,4,2),(dow['Mon'],dow['Wed'],dow['Fri'])) 

for d in d1,d2: 
    print d.strftime('%Y-%m-%d') 

Печать:

2013-04-02 
2013-04-03 
+0

Спасибо! Это был замечательный ответ. Интересное использование функции weekday(). Спасибо, многому научился. –

0

Вы могли бы попробовать что-то вроде этого:

from datetime import datetime 
from datetime import timedelta 

def return_next_tues_thur(dt): 
    while True: 
     dt += timedelta(days=1) 
     dow = dt.strftime(%w) 
     if dow == 2 || dow == 4: 
      return dt 

dt = datetime.now() # Or you set it: dt = datetime(2013, 4, 1) 
next_tues_thur = return_next_tues_thur(dt) 
print next_tues_thur.strftime("%Y-%m-%d") 

При этом используется метод strftime и модификатор %w, чтобы получить день недели от объекта datetime. (%w вернет int в диапазоне от 0 до 6, где ноль - воскресенье.)

Эта идея должна быть легко расширяемой до понедельника/среды/пятницы.

Смежные вопросы