2-значный год с использованием strptime() не способен хорошо разбирать дни рождения

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

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

При анализе с помощью Pythons datetime.strptime(dob, '%d-%b-%y') будет выдано:

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

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

В соответствии с docs это вполне допустимое поведение:

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

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

6
задан casr 19 июля '10 в 20:04
источник поделиться

3 ответов

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

if d > datetime.now():
    d = datetime(d.year - 100, d.month, d.day)
12
ответ дан Matthew Flaschen 19 июля '10 в 20:07
источник поделиться

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

def millenium(year, shift=1950):
    return (year-shift)%100 + shift
2
ответ дан SiggyF 19 июля '10 в 20:12
источник поделиться

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

0
ответ дан Amber 19 июля '10 в 20:07
источник поделиться

Другие вопросы по меткам