2010-07-19 4 views
6

Рассмотрим следующие дни рождения (как dob):2 цифр года с использованием strptime() не способен разобрать дни рождения очень хорошо

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

Когда анализируется с Питона 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.

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

ответ

12

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

if d > datetime.now(): 
    d = datetime(d.year - 100, d.month, d.day) 
+1

Это почти всегда хорошая идея, чтобы сделать этот вид тестирования здравомыслия. –

+0

Хороший ответ - в зависимости от реальных ситуаций использования для этого, вычитая 100 лет для дат в будущем, вероятно, хороший способ справиться с днями рождения. –

+0

Это кажется разумным ответом для моих нужд. Благодарю. – casr

0

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

2

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

def millenium(year, shift=1950): 
    return (year-shift)%100 + shift