2-значные годы с использованием strptime() не очень хорошо анализируют дни рождения
-
17-09-2020 - |
Вопрос
Рассмотрим следующие дни рождения (как dob
):
- 1 июня-68
- 1 июня-69
При анализе с помощью Python's 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 годами.
Я понимаю, почему функция настроена таким образом, но есть ли способ обойти это?Возможно, с определением ваших собственных диапазонов на 2-значные годы?
Решение
Если вы всегда используете его для празднования дней рождения, просто вычтите 100, если сейчас следующий год:
if d > datetime.now():
d = datetime(d.year - 100, d.month, d.day)
Другие советы
Эта функция переносит год на 1950-й:
def millenium(year, shift=1950):
return (year-shift)%100 + shift
Если вы ожидаете день рождения, вы всегда можете просто вручную изменить данные - любая дата в будущем автоматически переносится на столетие назад или что-то в этом роде.