`datetime.strftime` и` datetime.strptime` интерпретируют% Y по-разному - PullRequest
6 голосов
/ 28 ноября 2011

Я использую оператор, как показано ниже, для создания datetime объекта из строки:

t = datetime.strptime("0023-10-10", "%Y-%m-%d")

Позже, где-то в моем коде используется объект t и вызывается метод strftime с той же строкой формата:

t.strftime("%Y-%m-%d")

Это вызывает ValueError: year=23 is before 1900; the datetime strftime() methods require year >= 1900.

Кажется, что проверка ввода% Y отличается в этих двух похожих методах. Поэтому я должен сделать следующее, чтобы не допустить плохих лет, таких как 23:

try:
    format = "%Y-%m-%d"
    t = datetime.strptime("0023-10-10", format)
    t.strftime(format)
except ValueError:
    ...

Интересно, есть ли лучший способ сделать эту проверку.

Ответы [ 2 ]

4 голосов
/ 28 ноября 2011

Мне нравится ваша идея использовать try..except для проверки ввода, поскольку в некоторых будущих версиях Python годы <1000 могут быть приемлемыми. </p>

Этот комментарий в коде предполагает, что это ограничение ограничено текущей реализацией Python strftime.


В Python 2.7 исключение происходит для years < 1900, но в Python 3.2 исключение возникает для years < 1000:

import datetime as dt
format = "%Y-%m-%d"
t = dt.datetime.strptime("0023-10-10", format)
try:
    t.strftime(format)
except ValueError as err:
    print(err)

печать

year=23 is before 1000; the datetime strftime() methods require year >= 1000
2 голосов
/ 28 ноября 2011

Вы можете просто проверить if t.year < 1900 и, если оно вернет ошибку. Нет необходимости сознательно вызывать исключение.

...