2 dígitos para el año, utilizando strptime() no es capaz de analizar los cumpleaños muy bien
-
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?
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í.