datetime.datetime.strptime () с использованием переменной длины ввода - PullRequest
0 голосов
/ 13 октября 2018

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)

Есть ли способ отбросить крайние правые директивы, если входная строка недостаточно длинна вместо каннибализации левых?

Iпомечены 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 */
};

1 Ответ

0 голосов
/ 13 октября 2018

Ну, я думаю, вы должны сделать это самостоятельно, что не кажется трудным, потому что вы знаете шаблон.Нечто подобное должно быть в работе

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...