2011-09-26 12 views
18

In Python, la visualizzazione del giorno della settimana come numero intero utilizzando datetime.strftime() mostra un risultato diverso rispetto all'utilizzo di datetime.weekday().Perché Python's datetime.strftime ('% w') e datetime.weekday() utilizzano indici diversi per i giorni della settimana?

>>> import datetime 
>>> now = datetime.datetime.now() 
>>> now.strftime('%A') 
'Sunday' 
>>> now.strftime('%w') # Day of the week as an integer. 
'0' 
>>> now.weekday() # Day of the week as an integer, a different way. 
6 

Con strftime(), il formato di stringa %w ha Domenica come primo giorno della settimana. Con weekday(), è invece lunedì.

Qual è la storia del perché questi due sono diversi?

risposta

13

la funzione di Python strftime emula quella nella libreria c. Quindi, la motivazione che %w restituisce 0 per una domenica viene interamente da quello.

Al contrario, il metodo date.weekday() restituisce un 6 per domenica in quanto cerca di far corrispondere il comportamento del modulo molto precedente time. All'interno di quel modulo i tempi sono generalmente rappresentati da un struct_time e all'interno di questo, struct_time.tm_day utilizza uno 6 per rappresentare una domenica.

La domanda corretta diventa allora ... Perché time.struct_time rappresentano una Domenica come 6, quando tm struct della libreria C utilizza un 0 ??

E la risposta è ... perché lo fa. Questo comportamento è esistito sin da quando Guido ha controllato per la prima volta le funzioni gmtime e localtime nel 1993.

E Guido non può sbagliarsi ... quindi è meglio chiederglielo.

+0

Bene Guido è italiano e, come sottintende Foo Bah, il lunedì è il primo giorno della settimana in Italia –

+2

@ MikeM.Lin Guido è olandese, quindi "Anche se inizialmente potrebbe non essere ovvio a meno che tu non sia olandese." –

+2

Ho identificato "Guido" con "italiano". io :-P Vengo da New York, se questo lo rende più scusabile: –

5

In origine, lo standard ISO 8601 utilizzava 1 .. 7 per rappresentare da lunedì a domenica. Per comodità, in seguito è stata consentita l'interpretazione 0=Sunday.

Se si desidera utilizzare qualcosa che è più coerente, provare a utilizzare isoweekday

Lo standard 0=Monday è la convenzione europea. Immagino che non sia una sorpresa: P

+1

Questo non fornisce più coerenza di sorta. Quindi la domanda diventa perché '% w' rende come' 0' mentre 'isoweekday()' restituisce '7'. – donkopotamus

+0

@Donkopotamus il problema è che ci sono più standard e convenzioni coinvolte (come lo standard ISO e la convenzione degli Stati Uniti e la convenzione europea). In alcune versioni di strftime (come php) esiste un'opzione esplicita per usare la modalità US (iirc it era '% u' o'% U'. –

2

Forse weekday è basato sul locale mentre strftime non lo è? Perché ho un'uscita diversa:

In [14]: d.strftime("%A") 
Out[14]: 'Sunday' 

In [15]: d.strftime("%w") 
Out[15]: '0' 

In [16]: now.weekday() 
Out[16]: 0 
Problemi correlati