datetime.datetime.strptime () с использованием переменной длины ввода

1

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 */
};
  • 2
    Я попытался найти реализацию strptime чтобы увидеть, происходит ли что-то странное. Вопреки документам, он, кажется, был чистым Python с 2002 года .
  • 0
    Хотя в документах говорится только, что Python вызывает время strftime платформы, а не время strptime платформы, поэтому, хотя документы запутанные и неясные, это не может быть прямым противоречием.
Теги:
datetime

1 ответ

0

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

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.

  • 0
    Я бы сказал, что проще заполнить ввод нулями. s.ljust(20) . Но я бы предпочел, чтобы функция имела последовательное поведение
  • 0
    Это привязка к C, а философия в C заключается в том, что «если вы дадите неожиданный ввод, который, вероятно, будет иметь неизвестное поведение, и это ваша проблема». Потому что, когда вы используете C, вы хотите быть очень эффективным, поэтому вы просто предполагаете, что ввод правильный, и позволяете пользователю выполнить проверку, если он этого хочет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню