datetime.datetime.strptime, похоже, принудительно сопоставляет директиву независимо от используемой длины строки. Используя короткие строки, директивы заставят объект datetime.datetime использовать "что-то" в строке независимо от фактических директив.
Это правильное поведение с достаточным количеством входных данных для заполнения директив
>>> datetime.datetime.strptime('20180822163014', '%Y%m%d%H%M%S')
datetime.datetime(2018, 8, 22, 16, 30, 14)
Однако эти директивы изменят предыдущий синтаксический анализ
>>> datetime.datetime.strptime('20180822163014', '%Y%m%d%H%M%S%f')
datetime.datetime(2018, 8, 22, 16, 30, 1, 400000)
Есть ли способ отбросить самые правые директивы, если входная строка не достаточно длинная, а не cannibalizing левой?
Я отметил C и ubuntu, потому что документация говорит
"Полный набор поддерживаемых форматных кодов зависит от разных платформ, потому что Python вызывает функцию платформы strftime() платформы C, а вариации платформы являются общими. Чтобы просмотреть полный набор кодов формата, поддерживаемых на вашей платформе, обратитесь к документации по strftime (3) ".
РЕДАКТИРОВАТЬ:
man ctime
показывает следующую структуру как вывод. Интересно, что точность микросекунд (% f), похоже, не поддерживается.
struct tm {
int tm_sec; /* Seconds (0-60) */
int tm_min; /* Minutes (0-59) */
int tm_hour; /* Hours (0-23) */
int tm_mday; /* Day of the month (1-31) */
int tm_mon; /* Month (0-11) */
int tm_year; /* Year - 1900 */
int tm_wday; /* Day of the week (0-6, Sunday = 0) */
int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};
Ну, я думаю, вы должны сделать это сами, что не кажется трудным, потому что вы знаете шаблон. Что-то вроде этого должно быть на работе
pattern = ""
if len(s) == 0: raise Exception "empty time string"
if len(s) <= 4: pattern += "%Y"
... # as many if as you need here
datetime.datetime.strptime(s, pattern)
Что очень больно писать, если у вас длинный шаблон даты, но я сомневаюсь, что есть какая-то функция, выполняющая его уже в модуле datetime - по той причине, что его просто связывание с C.
Вы можете попробовать сделать что-то более общее и спросить, может ли он быть добавлен в модуль datetime.
s.ljust(20)
. Но я бы предпочел, чтобы функция имела последовательное поведение
strptime
чтобы увидеть, происходит ли что-то странное. Вопреки документам, он, кажется, был чистым Python с 2002 года .