2011-09-26 7 views
18

En Python, mostrar el día de la semana como un número entero que usa datetime.strftime() muestra un resultado diferente al de usar datetime.weekday().¿Por qué las funciones datetime.strftime ('% w') y datetime.weekday() de Python usan índices diferentes para los días de la semana?

>>> 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(), el formato de cadena %w tiene el domingo como el primer día de la semana. Con weekday(), es lunes en su lugar.

¿Cuál es la historia de por qué estos dos son diferentes?

Respuesta

13

La función strftime de Python emula eso en la biblioteca c. Por lo tanto, la motivación que %w devuelve 0 para un domingo viene completamente de eso.

En contraste, el método date.weekday() devuelve 6 para el domingo, ya que trata de coincidir con el comportamiento del módulo mucho más antiguo time. Dentro de ese módulo, los tiempos generalmente están representados por un struct_time y dentro de este, struct_time.tm_day usa un 6 para representar un domingo.

La pregunta correcta se convierte entonces ... ¿por qué time.struct_time representan un domingo como 6, cuando el jugador de la biblioteca C tm utiliza una estructura 0 ??

Y la respuesta es ... porque simplemente lo hace. Este comportamiento ha existido desde que Guido revisó por primera vez las funciones gmtime y localtime en 1993.

Y Guido no puede estar equivocado ... así que es mejor que se lo pregunte.

+0

Bueno, Guido es italiano. Y, como insinuó Foo Bah, el lunes es el primero día de la semana en Italia. –

+2

@ MikeM.Lin Guido es holandés. Por lo tanto, "aunque esa forma puede no ser obvia al principio a menos que seas holandés". –

+2

Yo equiparaba a "Guido" con "italiano". Eso era tan malo de yo :-P Soy de Nueva York, si eso lo hace más excusable. –

5

Originalmente, el estándar ISO 8601 usa 1 .. 7 para representar de lunes a domingo. Para mayor comodidad, más adelante se permitió la interpretación 0=Sunday.

Si desea utilizar algo que es más consistente, intente utilizar isoweekday

El estándar 0=Monday es la convención europea. Supongo que eso no es sorprendente: P

+1

Esto no proporciona ninguna consistencia más que en absoluto. Entonces surge la pregunta por qué '% w' se representa como' 0', mientras que 'isoweekday()' devuelve '7'. – donkopotamus

+0

@Donkopotamus, el problema es que hay varios estándares y convenciones involucrados (como el estándar ISO y el convenio de los EE. UU. Y la convención europea). En algunas versiones de strftime (como php) hay una opción explícita para usar el modo estadounidense (iirc era '% u' o'% U'. –

2

Tal vez weekday se basa en la localidad, mientras que strftime no lo es? Porque tengo salida diferente:

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

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

In [16]: now.weekday() 
Out[16]: 0 
Cuestiones relacionadas