Двузначные года с использованием strptime () не способны хорошо анализировать дни рождения - PullRequest
6 голосов
/ 19 июля 2010

Рассмотрим следующие дни рождения (как dob):

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

При разборе с Python datetime.strptime(dob, '%d-%b-%y') даст:

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

Ну, конечно, они должны были родиться в одно и то же десятилетие, но сейчас даже в том же веке!

Согласно документам это совершенно корректное поведение:

Когда принимаются двухзначные годы, они конвертируются в соответствии с стандарт POSIX или X / Open: значения 69-99 сопоставлены с 1969-1999, и значения 0–68 отображаются на 2000–2068.

Я понимаю, почему функция настроена так, но есть ли способ обойти это? Возможно с определением ваших собственных диапазонов для двузначных лет?

Ответы [ 3 ]

12 голосов
/ 19 июля 2010

Если вы всегда используете его для дней рождений, просто вычтите 100, если год после этого:

if d > datetime.now():
    d = datetime(d.year - 100, d.month, d.day)
2 голосов
/ 19 июля 2010

Эта функция переводит год на 1950:

def millenium(year, shift=1950):
    return (year-shift)%100 + shift
0 голосов
/ 19 июля 2010

Если вы ожидаете день рождения, вы всегда можете просто вручную массировать данные - любая дата в будущем автоматически откладывается на столетие или что-то подобное.

...