2010-07-19 9 views
6

Considere las siguientes cumpleaños (como dob):2 años dígitos usando strptime() no es capaz de analizar los cumpleaños muy bien

  • 1-Jun-68
  • 1-Jun-69

Si analizamos con Python de datetime.strptime(dob, '%d-%b-%y') producirá:

  • datetime.datetime(2068, 6, 1, 0, 0)
  • datetime.datetime(1969, 6, 1, 0, 0)

Bueno, por supuesto que se supone que nacer en la misma década, pero ahora ni siquiera en el mismo siglo!

Según la docs Este comportamiento es perfectamente válido:

Cuando se aceptan año de 2 dígitos, que se convierten de acuerdo con la POSIX o X estándar/Open: valores 69-99 se asignan a 1969 -1999, y los valores 0-68 se asignan a 2000-2068.

Entiendo por qué la función está configurada así, pero ¿hay alguna manera de evitar esto? ¿Tal vez con la definición de sus propios rangos para años de 2 dígitos?

Respuesta

12

Si siempre lo está utilizando para cumpleaños, simplemente restar 100 si el año es después de ahora:

if d > datetime.now(): 
    d = datetime(d.year - 100, d.month, d.day) 
+1

es casi siempre una buena idea para hacer este tipo de pruebas de cordura. –

+0

Buena respuesta: dependiendo de las situaciones de uso real para esto, restar 100 años para las fechas en el futuro es probablemente una buena manera de manejar los cumpleaños. –

+0

Esto parece una respuesta sensata para mis necesidades. Gracias. – casr

0

Si usted está esperando un cumpleaños, siempre se puede simplemente dar masajes manualmente los datos - cualquier fecha en el futuro se retrasa automáticamente un siglo, o algo así.

2

Esta función desplaza el año de 1950:

def millenium(year, shift=1950): 
    return (year-shift)%100 + shift 
Cuestiones relacionadas