2 dígitos para el año, utilizando strptime() no es capaz de analizar los cumpleaños muy bien

StackOverflow https://stackoverflow.com/questions/3283209

  •  17-09-2020
  •  | 
  •  

Pregunta

Considere el siguiente cumpleaños (como dob):

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

Cuando se analiza con Python datetime.strptime(dob, '%d-%b-%y') producirá:

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

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

De acuerdo a la docs esto es perfectamente válido comportamiento:

Cuando años de 2 dígitos son aceptadas, se convierten según el POSIX o de X/Open standard:los valores 69-99 se asignan a 1969-1999, y valores 0-68 se asignan a 2000-2068.

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

¿Fue útil?

Solución

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

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

Otros consejos

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

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

Si usted está esperando un cumpleaños, siempre se puede manualmente masaje de los datos - cualquier fecha en el futuro se establece automáticamente de vuelta de un siglo, o algo así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top