Преобразовать строку в объект datetime без strptime - PullRequest
1 голос
/ 07 июня 2019

Итак, если вы не говорите Python, как выводить время, он делает это:

print(datetime.datetime.utcnow())
>> 2019-06-07 13:07:55.777035

Чтобы прочитать строку времени в объект datetime, вы обычно используете метод .strptime() и сообщаете ему, что он ищет.

Я знаю, что есть библиотеки, подобные dateutil, которые не являются частью стандартных встроенных библиотек Python, которые могут интерпретировать строку даты. Учитывая, что эта конкретная строка была создана стандартным Python без каких-либо указаний на то, как это должно быть, может ли Python без встроенных библиотек вернуть его обратно в datetime.datetime объект, не сообщая strptime(), что искать?

Ответы [ 2 ]

2 голосов
/ 07 июня 2019

Для тех, кто использует Python 3.7 или более позднюю версию, datetime.fromisoformat() будет анализировать строки даты и времени в одном из форматов ISO 8601, испускаемых встроенными методами (включая строку даты и времени в вопросе). Из документов:

Возвращает datetime, соответствующий date_string в одном из форматов испускается date.isoformat() и datetime.isoformat(). В частности, эта функция поддерживает строки в формате (ах) YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]], где * может соответствовать любому отдельному символу.

Внимание: Это не поддерживает разбор произвольных строк ISO 8601 - это предназначен только в качестве обратной операции datetime.isoformat().

2 голосов
/ 07 июня 2019

Краткий ответ: нет. В то время как datetime выводит в этом непротиворечивом формате, кажется, что у модуля нет тривиального способа считывания того же формата обратно (например, константа строки формата). Более того, strptime() не имеет значения по умолчанию для аргумента формата, поэтому мы должны указать его. Однако сделать это очень просто:

x = str(datetime.datetime.utcnow())
dt = datetime.datetime.strptime(x, "%Y-%m-%d %H:%M:%S:%f")

, и вы могли бы легко превратить эту строку формата в константу, которую вы используете в своей программе (и это хорошо закодировать - этот формат стандартный, он не изменится):

utc_format = "%Y-%m-%d %H:%M:%S:%f"
...
dt = datetime.datetime.strptime(x, utc_format)

Теоретически вы также можете использовать срезы строк или регулярные выражения для явного извлечения года, месяца, дня и т. Д., Но тогда вам все равно придется вручную создавать объект datetime из всего этого, и нет веских причин для этого. через беду, когда существует дата и время. Я не верю, что в стандартной библиотеке есть что-то еще, что может сделать это лучше.

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