2013-04-02 4 views
2

J'utilise "datetime" et je n'arrive pas à trouver comment saisir la date au format "% Y-% M-% d" par jour de la semaine. Par exemple:Trouver la prochaine fois par jour de la semaine

Depuis aujourd'hui est 2013-04-01 (un lundi), quel code saisirait le mardi ou jeudi suivant? (La sortie devrait être le 2013-04-02 - Mardi)

Ou si la date est le 2013-04-02, un mardi, quel code saisirait le prochain lundi, mercredi ou vendredi? (Sortie doit être 03.04.2013 - Le lendemain ou mercredi)

Merci,

+0

Ce n'est pas lié à Python ou ses modules de date et d'heure . Vous devez écrire un algorithme qui calcule cela. – wRAR

+0

Merci de m'avoir montré la méthode de la semaine(). C'est ce dont j'avais besoin! –

Répondre

3

Cela fonctionne:

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') 

Ou (peut-être mieux, mais moins général):

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') 

Prints:

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

Merci! C'était une merveilleuse réponse. Utilisation intéressante de la fonction weekly(). Merci, j'ai beaucoup appris. –

0

Vous pouvez essayer quelque chose comme ceci:

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") 

Cette méthode utilise la strftime et le modificateur %w pour obtenir le jour de la semaine à partir d'un objet datetime. (%w retournera un int dans la plage de 0 à 6 où zéro est le dimanche.)

Cette idée devrait être facilement extensible au lundi/mercredi/vendredi.

Questions connexes