Anos de 2 dígitos usando strptime() não são capazes de analisar aniversários muito bem

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

  •  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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top