Anos de 2 dígitos usando strptime() não são capazes de analisar aniversários muito bem
-
17-09-2020 - |
Pergunta
Considere os seguintes aniversários (como dob
):
- 1º de junho de 68
- 1º de junho de 69
Quando analisado com Python datetime.strptime(dob, '%d-%b-%y')
renderá:
datetime.datetime(2068, 6, 1, 0, 0)
datetime.datetime(1969, 6, 1, 0, 0)
Bem, é claro que eles deveriam ter nascido na mesma década, mas agora nem sequer é no mesmo século!
De acordo com documentos este é um comportamento perfeitamente válido:
Quando os anos de dois dígitos são aceitos, eles são convertidos de acordo com o Posix ou X/Open Standard:Os valores 69-99 são mapeados para 1969-1999 e os valores 0 a 68 são mapeados para 2000-2068.
Entendo por que a função está configurada assim, mas existe uma maneira de contornar isso?Talvez definindo seus próprios intervalos para anos de 2 dígitos?
Solução
Se você sempre usa em aniversários, basta subtrair 100 se o ano for depois de agora:
if d > datetime.now():
d = datetime(d.year - 100, d.month, d.day)
Outras dicas
Esta função muda o ano para 1950:
def millenium(year, shift=1950):
return (year-shift)%100 + shift
Se você está esperando um aniversário, você pode apenas massagear manualmente os dados - qualquer data no futuro é automaticamente atrasada em um século, ou algo assim.