Как мне разобрать дату в формате ISO 8601?

Для тех, кто найдет этот поток в будущем, обратите внимание, что принятый ответ не всегда возвращает правильное значение, если вы его обобщите, так как он будет задыхаться от операторов регулярных выражений, таких как $ и .. Вот лучшая версия, которая может обрабатывать любую иглу :

function occurrences (haystack, needle) {
  var _needle = needle
    .replace(/\[/g, '\\[')
    .replace(/\]/g, '\\]')
  return (
    haystack.match(new RegExp('[' + _needle + ']', 'g')) || []
  ).length
}
539
задан martineau 23 December 2018 в 16:37
поделиться

5 ответов

Отметьте в Python 2.6 + и Py3K, %f символ ловит микросекунды.

>>> datetime.datetime.strptime("2008-09-03T20:56:35.450686Z", "%Y-%m-%dT%H:%M:%S.%fZ")

Посмотрите выпуск здесь

149
ответ дан nofinator 23 December 2018 в 16:37
поделиться
import re,datetime
s="2008-09-03T20:56:35.450686Z"
d=datetime.datetime(*map(int, re.split('[^\d]', s)[:-1]))
34
ответ дан Ted 23 December 2018 в 16:37
поделиться

Попробуйте модуль iso8601 ; это делает точно это.

существует несколько других опций, упомянутых на страница WorkingWithTime на Wiki python.org.

70
ответ дан user 23 December 2018 в 16:37
поделиться

Какова точная ошибка, которую Вы получаете? Похож на него следующее?

>>> datetime.datetime.strptime("2008-08-12T12:20:30.656234Z", "%Y-%m-%dT%H:%M:%S.Z")
ValueError: time data did not match format:  data=2008-08-12T12:20:30.656234Z  fmt=%Y-%m-%dT%H:%M:%S.Z

, Если да, можно разделить входную строку на".", и затем добавить микросекунды к дате и времени, Вы добрались.

Попытка это:

>>> def gt(dt_str):
        dt, _, us= dt_str.partition(".")
        dt= datetime.datetime.strptime(dt, "%Y-%m-%dT%H:%M:%S")
        us= int(us.rstrip("Z"), 10)
        return dt + datetime.timedelta(microseconds=us)

>>> gt("2008-08-12T12:20:30.656234Z")
datetime.datetime(2008, 8, 12, 12, 20, 30, 656234)
28
ответ дан Peter Mortensen 23 December 2018 в 16:37
поделиться

Иначе должен использовать специализированный синтаксический анализатор для ISO 8601, должен использовать изосинтаксический анализ функция dateutil синтаксического анализатора:

from dateutil import parser

date = parser.isoparse("2008-09-03T20:56:35.450686+01:00")
print(date)

Вывод:

2008-09-03 20:56:35.450686+01:00

Эта функция также упоминается в документация для стандартной функции Python datetime.fromisoformat:

А больше полнофункционального синтаксического анализатора ISO 8601, dateutil.parser.isoparse доступно в стороннем пакете dateutil.

2
ответ дан 22 November 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: