programing

ISO 8601 형식의 날짜를 해석하려면 어떻게 해야 합니까?

minecode 2022. 9. 22. 21:20
반응형

ISO 8601 형식의 날짜를 해석하려면 어떻게 해야 합니까?

RFC 3339 문자열을 다음과 같이 해석해야 합니다."2008-09-03T20:56:35.450686Z"Python Python's »에datetimediscloss.discloss.

Python 스탠다드 라이브러리에서 찾았지만, 그다지 편리하지 않습니다.

어떻게 하면 좋을까요?

isoparsepython-dateutil로부터의 함수

비단뱀 대추 패키지는 문제의 것과 같은 RFC 3339 datetime 문자열뿐만 아니라 RFC 3339에 준거하지 않는 다른 ISO 8601 날짜 및 시간 문자열(UTC 오프셋이 없거나 날짜만 나타내는 문자열 등)도 해석해야 합니다.

>>> import dateutil.parser
>>> dateutil.parser.isoparse('2008-09-03T20:56:35.450686Z') # RFC 3339 format
datetime.datetime(2008, 9, 3, 20, 56, 35, 450686, tzinfo=tzutc())
>>> dateutil.parser.isoparse('2008-09-03T20:56:35.450686') # ISO 8601 extended format
datetime.datetime(2008, 9, 3, 20, 56, 35, 450686)
>>> dateutil.parser.isoparse('20080903T205635.450686') # ISO 8601 basic format
datetime.datetime(2008, 9, 3, 20, 56, 35, 450686)
>>> dateutil.parser.isoparse('20080903') # ISO 8601 basic format, date only
datetime.datetime(2008, 9, 3, 0, 0)

python-dateutil 패키지에도 이 있습니다.isoparse아마 덜 엄격할 것 같지만 둘 다 상당히 관대하고 전달된 문자열을 해석하려고 합니다.오독 가능성을 배제하려면 다음 기능보다 더 엄격한 기능을 사용해야 합니다.

Python 3.7+의 빌트인과의 비교

dateutil.parser.isoparse파서이지만 ISO-8601은 과 같습니다.fromisoformat일부러 그런 건 아니에요이 주의 사항에 대해서는 후자 기능의 문서를 참조하십시오.(이 답변을 참조해 주세요).

datetime에는 Python Python 3.7을 datetime.isoformat().

학급 method :

를 반환하다datetime 대응하다date_string에서 중 date.isoformat() ★★★★★★★★★★★★★★★★★」datetime.isoformat().

특히 이 함수는 다음 형식의 문자열을 지원합니다.

YYYY-MM-DD[*HH[:MM[:SS[.mmm[mmm]]]][+HH:MM[:SS[.ffffff]]]]

서 ''는*는 임의의 단일 문자와 일치할 수 있습니다.

주의:이것은 임의의 ISO 8601 문자열의 해석을 지원하지 않습니다.이것은, 다음의 역연산을 목적으로 하고 있을 뿐입니다.datetime.isoformat().

예:

>>> from datetime import datetime
>>> datetime.fromisoformat('2011-11-04')
datetime.datetime(2011, 11, 4, 0, 0)

반드시 의사의 주의사항을 읽어주세요!

Python 2.6+ 및 Py3K에서는 %f 문자는 마이크로초를 잡습니다.

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

여기를 참조해 주세요.

여기에서는 다음과 같은 몇 가지 답변을 사용하여 RFC 3339 또는 ISO 8601 데이터 타임의 타임존을 해석할 것을 제안하고 있습니다.

2008-09-03T20:56:35.450686Z

이건 좋지 않은 생각이야.

0 이외의 UTC 오프셋을 포함한 완전한 RFC 3339 포맷을 지원하는 경우, 이러한 답변은 기능하지 않습니다.RFC 3339 구문을 해석하기 때문에 실제로는 동작할 수 없습니다.strptime구문을 할 수 .Python의 datetime은 RFC 3339의 datetime이다.

문제는 UTC 오프셋입니다.RFC 3339의 인터넷 날짜/시간 형식에서는 모든 날짜 시간에 UTC 오프셋이 포함되어 있고 이러한 오프셋은 다음 중 하나를 사용할 수 있어야 합니다.Z(' time의 줄임말) ('Zulu time'의 줄임말+HH:MM ★★★★★★★★★★★★★★★★★」-HH:MM 「」, 「」등)+05:00 ★★★★★★★★★★★★★★★★★」-10:30.

그 결과, RFC 3339 의 데이터 타임은 모두 유효합니다.

  • 2008-09-03T20:56:35.450686Z
  • 2008-09-03T20:56:35.450686+05:00
  • 2008-09-03T20:56:35.450686-10:30

아,, 식열 used used에서 입니다.strptime ★★★★★★★★★★★★★★★★★」strftime에는 RFC 3339 형식의 UTC 오프셋에 대응하는 디렉티브가 없습니다.서포트하는 디렉티브의 완전한 리스트는, https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior, 에서 입수할 수 있습니다.리스트에 포함되는 유일한 UTC 오프셋 디렉티브는 다음과 같습니다.%z:

%z

+HHM 또는 -HHM 형식의 UTC 오프셋(개체가 순진한 경우 빈 문자열).

예: (공백), +0000, -0400, +1030

은 RFC 하지 않으며, RFC 3339를 사용하려고 .또한 이 형식을 사용하여%zRFC 3339는 RFC 3339로 규정되어 있습니다.

>>> from datetime import datetime
>>> datetime.strptime("2008-09-03T20:56:35.450686Z", "%Y-%m-%dT%H:%M:%S.%f%z")
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/lib/python3.4/_strptime.py", line 500, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "/usr/lib/python3.4/_strptime.py", line 337, in _strptime
    (data_string, format))
ValueError: time data '2008-09-03T20:56:35.450686Z' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'
>>> datetime.strptime("2008-09-03T20:56:35.450686+05:00", "%Y-%m-%dT%H:%M:%S.%f%z")
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/lib/python3.4/_strptime.py", line 500, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "/usr/lib/python3.4/_strptime.py", line 337, in _strptime
    (data_string, format))
ValueError: time data '2008-09-03T20:56:35.450686+05:00' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'

(실제로 위의 내용은 Python 3에서 볼 수 있는 것입니다.Python 2에서는 더 간단한 이유로 실패할 수 있습니다. Python 2에서는 이 지침이 전혀 구현되지 않습니다.)

에서는 여러 을 하고 있습니다.strptime 것이 그대로의 '이러다'를 으로써 이 를 해결한다.Z문자열에 되며, 형식 합니다.Z 문자열하고 datetime datetime을 한다)을 참조해 주세요.datetime오타타 ( 타타타타타 ) : )

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

이렇게 하면 원래 datetime 문자열에 포함된 시간대 정보가 폐기되므로 이 결과도 올바른 것으로 간주해야 하는지 의문입니다.단, 보다 중요한 것은 이 접근방식은 특정 UTC 오프셋을 포맷스트링에 하드코딩하기 때문에 RFC 3339 datetime을 다른 UTC 오프셋으로 해석하는 순간 초크됩니다.

>>> datetime.strptime("2008-09-03T20:56:35.450686+05:00", "%Y-%m-%dT%H:%M:%S.%fZ")
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/lib/python3.4/_strptime.py", line 500, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "/usr/lib/python3.4/_strptime.py", line 337, in _strptime
    (data_string, format))
ValueError: time data '2008-09-03T20:56:35.450686+05:00' does not match format '%Y-%m-%dT%H:%M:%S.%fZ'

RFC 3339 datetime을 Zulu 시간으로 지원해야 하며 다른 타임존 오프셋이 있는 datetime을 지원하지 않아야 한다고 확신하지 않는 한 사용하지 마십시오.strptime대신 여기 답변에 기재되어 있는 다른 많은 접근법 중 하나를 사용합니다.

iso8601 모듈을 사용해 보십시오. 이 모듈은 정확하게 작동합니다.

python.org Wiki의 Working With Time 페이지에는 몇 가지 다른 옵션이 있습니다.

Python 3.7부터 strptime은 UTC 오프셋(소스)에서 콜론 구분 기호를 지원합니다.그 후 다음을 사용할 수 있습니다.

import datetime
datetime.datetime.strptime('2018-01-31T09:24:31.488670+00:00', '%Y-%m-%dT%H:%M:%S.%f%z')

편집:

와 같이 isoformat()을 datetime 객체를 사용할 수 .datetime.fromisoformat().

정확히 어떤 오류가 발생합니까?다음과 같은 것입니까?

>>> 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)

중 : replace " " " " " " " " " " replace " :'Z''+00:00'3.7의 - Python 3.7+를 사용합니다.fromisoformat:

from datetime import datetime

s = "2008-09-03T20:56:35.450686Z"

datetime.fromisoformat(s.replace('Z', '+00:00'))
# datetime.datetime(2008, 9, 3, 20, 56, 35, 450686, tzinfo=datetime.timezone.utc)

일일 ~일도 although although although although 。strptime할 수 'Z'UTC 문자, ~ x40빠릅니다(참조 항목:스트랩 타임의 고속화):

%timeit datetime.fromisoformat(s.replace('Z', '+00:00'))
388 ns ± 48.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit dateutil.parser.isoparse(s)
11 µs ± 1.05 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit datetime.strptime(s, '%Y-%m-%dT%H:%M:%S.%f%z')
15.8 µs ± 1.32 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit dateutil.parser.parse(s)
87.8 µs ± 8.54 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

(Windows 10의 경우 Python 3.9.12 x 64)

import re
import datetime
s = "2008-09-03T20:56:35.450686Z"
d = datetime.datetime(*map(int, re.split(r'[^\d]', s)[:-1]))

현재는 Arrow를 서드파티 솔루션으로 사용할 수도 있습니다.

>>> import arrow
>>> date = arrow.get("2008-09-03T20:56:35.450686Z")
>>> date.datetime
datetime.datetime(2008, 9, 3, 20, 56, 35, 450686, tzinfo=tzutc())

를 사용합니다.python-dateutil★★★★

>>> import dateutil.parser as dp
>>> t = '1984-06-02T19:05:00.000Z'
>>> parsed_t = dp.parse(t)
>>> print(parsed_t)
datetime.datetime(1984, 6, 2, 19, 5, tzinfo=tzutc())

문서

ISO 8601 타임스탬프를 해석하는 가장 빠른 방법은 ciso8601입니다.이름에서 알 수 있듯이 C에서 구현됩니다.

import ciso8601
ciso8601.parse_datetime('2014-01-09T21:48:00.921000+05:30')

GitHub Repo README은 다른 응답에 나열된 다른 모든 라이브러리보다 10배 이상 빠른 속도를 보여줍니다.

제 개인 프로젝트에는 ISO 8601의 파싱이 많이 포함되어 있었습니다.전화를 바꿔서 10배 빠르게 할 수 있어서 좋았습니다.:)

편집: 그 후 ciso8601의 유지보수가 되었습니다.그 어느 때보다 빨라졌어요!

dateutil을 사용하지 않으려면 다음 기능을 사용해 보십시오.

def from_utc(utcTime,fmt="%Y-%m-%dT%H:%M:%S.%fZ"):
    """
    Convert UTC time string to time.struct_time
    """
    # change datetime.datetime to time, return time.struct_time type
    return datetime.datetime.strptime(utcTime, fmt)

테스트:

from_utc("2007-03-04T21:08:12.123Z")

결과:

datetime.datetime(2007, 3, 4, 21, 8, 12, 123000)

Django를 사용하는 경우 표준 시간대를 포함하여 ISO 형식과 유사한 여러 형식을 사용할 수 있는 날짜 분석 모듈을 제공합니다.

만약 당신이 Django를 사용하지 않고 여기에 언급된 다른 라이브러리 중 하나를 사용하고 싶지 않다면, 당신은 아마도 당신의 프로젝트에 dateparse의 Django 소스 코드를 적용할 수 있습니다.

ISO 8601 규격의 파서를 코드화하여 GitHub: https://github.com/boxed/iso8601에 올렸습니다.이 구현은 Python의 datetime 모듈의 지원되는 날짜 범위를 벗어나는 기간, 간격, 주기적 간격 및 날짜를 제외한 사양의 모든 것을 지원합니다.

테스트가 포함되어 있습니다.p

이것은 Python 3.2 이후의 stdlib에 유효합니다(모든 타임스탬프가 UTC인 경우).

from datetime import datetime, timezone, timedelta
datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S.%fZ").replace(
    tzinfo=timezone(timedelta(0)))

예를들면,

>>> datetime.utcnow().replace(tzinfo=timezone(timedelta(0)))
... datetime.datetime(2015, 3, 11, 6, 2, 47, 879129, tzinfo=datetime.timezone.utc)

저는 iso8601utils의 저자입니다.GitHub 또는 PyPI에서 찾을 수 있습니다.예를 해석하는 방법은 다음과 같습니다.

>>> from iso8601utils import parsers
>>> parsers.datetime('2008-09-03T20:56:35.450686Z')
datetime.datetime(2008, 9, 3, 20, 56, 35, 450686)

ISO 8601로 datetime.datetime서드파티 모듈을 설치하지 않고 지원되는 모든 Python 버전에서 객체는 SQLite의 날짜 분석기를 사용하는 것입니다.

#!/usr/bin/env python
from __future__ import with_statement, division, print_function
import sqlite3
import datetime

testtimes = [
    "2016-08-25T16:01:26.123456Z",
    "2016-08-25T16:01:29",
]
db = sqlite3.connect(":memory:")
c = db.cursor()
for timestring in testtimes:
    c.execute("SELECT strftime('%s', ?)", (timestring,))
    converted = c.fetchone()[0]
    print("%s is %s after epoch" % (timestring, converted))
    dt = datetime.datetime.fromtimestamp(int(converted))
    print("datetime is %s" % dt)

출력:

2016-08-25T16:01:26.123456Z is 1472140886 after epoch
datetime is 2016-08-25 12:01:26
2016-08-25T16:01:29 is 1472140889 after epoch
datetime is 2016-08-25 12:01:29

Django의 parse_datetime() 함수는 UTC 오프셋이 있는 날짜를 지원합니다.

parse_datetime('2016-08-09T15:12:03.65478Z') =
datetime.datetime(2016, 8, 9, 15, 12, 3, 654780, tzinfo=<UTC>)

따라서 전체 프로젝트의 필드에 있는 ISO 8601 날짜를 구문 분석하는 데 사용할 수 있습니다.

from django.utils import formats
from django.forms.fields import DateTimeField
from django.utils.dateparse import parse_datetime

class DateTimeFieldFixed(DateTimeField):
    def strptime(self, value, format):
        if format == 'iso-8601':
            return parse_datetime(value)
        return super().strptime(value, format)

DateTimeField.strptime = DateTimeFieldFixed.strptime
formats.ISO_INPUT_FORMATS['DATETIME_INPUT_FORMATS'].insert(0, 'iso-8601')

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에서 사용할 수 있습니다.

그래도 사용한다면 다음 중 하나를 추천할 수 있습니다.pandas서 당신은 할 수 있다

ts_1 = pd.Timestamp('2020-02-18T04:27:58.000Z')    
ts_2 = pd.Timestamp('2020-02-18T04:27:58.000')

Rant: 2021년 날짜 문자열 구문 분석과 같은 것에 대해 여전히 걱정할 필요가 있다는 것은 믿을 수 없습니다.

ISO 할 수 때문에 기본적으로 ISO 8601은 콜론이나 를 사용할 수 있습니다.CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm] 이러한해야 합니다.strptime 을 . 。

utc datetime 。


If you just want a basic case that work for UTC with the Z suffix like 2016-06-29T19:36:29.3453Z:

datetime.datetime.strptime(timestamp.translate(None, ':-'), "%Y%m%dT%H%M%S.%fZ")


If you want to handle timezone offsets like 2016-06-29T19:36:29.3453-0400 or 2008-09-03T20:56:35.450686+05:00 use the following. These will convert all variations into something without variable delimiters like 20080903T205635.450686+0500 making it more consistent/easier to parse.

import re
# this regex removes all colons and all 
# dashes EXCEPT for the dash indicating + or - utc offset for the timezone
conformed_timestamp = re.sub(r"[:]|([-](?!((\d{2}[:]\d{2})|(\d{4}))$))", '', timestamp)
datetime.datetime.strptime(conformed_timestamp, "%Y%m%dT%H%M%S.%f%z" )


If your system does not support the %z strptime directive (you see something like ValueError: 'z' is a bad directive in format '%Y%m%dT%H%M%S.%f%z') then you need to manually offset the time from Z (UTC). Note %z may not work on your system in python versions < 3 as it depended on the c library support which varies across system/python build type (i.e. Jython, Cython, etc.).

import re
import datetime

# this regex removes all colons and all 
# dashes EXCEPT for the dash indicating + or - utc offset for the timezone
conformed_timestamp = re.sub(r"[:]|([-](?!((\d{2}[:]\d{2})|(\d{4}))$))", '', timestamp)

# split on the offset to remove it. use a capture group to keep the delimiter
split_timestamp = re.split(r"[+|-]",conformed_timestamp)
main_timestamp = split_timestamp[0]
if len(split_timestamp) == 3:
    sign = split_timestamp[1]
    offset = split_timestamp[2]
else:
    sign = None
    offset = None

# generate the datetime object without the offset at UTC time
output_datetime = datetime.datetime.strptime(main_timestamp +"Z", "%Y%m%dT%H%M%S.%fZ" )
if offset:
    # create timedelta based on offset
    offset_delta = datetime.timedelta(hours=int(sign+offset[:-2]), minutes=int(sign+offset[-2:]))
    # offset datetime with timedelta
    output_datetime = output_datetime + offset_delta

2.X 표준 라이브러리로 동작하는 경우는, 다음의 순서에 따릅니다.

calendar.timegm(time.strptime(date.split(".")[0]+"UTC", "%Y-%m-%dT%H:%M:%S%Z"))

calendar.timegm은 time.time의 gm 버전이 누락되어 있습니다.

python-dateutil은 비활성 날짜 문자열을 구문 분석할 때 예외를 발생시키므로 예외를 포착해야 할 수 있습니다.

from dateutil import parser
ds = '2012-60-31'
try:
  dt = parser.parse(ds)
except ValueError, e:
  print '"%s" is an invalid date' % ds

요즘 인기 있는 Requests: HTTP for Human™ 패키지의 저자 Maya: Datetimes for Humans있습니다.

>>> import maya
>>> str = '2008-09-03T20:56:35.450686Z'
>>> maya.MayaDT.from_rfc3339(str).datetime()
datetime.datetime(2008, 9, 3, 20, 56, 35, 450686, tzinfo=<UTC>)

Mark Amery의 훌륭한 답변 덕분에 가능한 모든 ISO 형식의 datetime:

class FixedOffset(tzinfo):
    """Fixed offset in minutes: `time = utc_time + utc_offset`."""
    def __init__(self, offset):
        self.__offset = timedelta(minutes=offset)
        hours, minutes = divmod(offset, 60)
        #NOTE: the last part is to remind about deprecated POSIX GMT+h timezones
        #  that have the opposite sign in the name;
        #  the corresponding numeric value is not used e.g., no minutes
        self.__name = '<%+03d%02d>%+d' % (hours, minutes, -hours)
    def utcoffset(self, dt=None):
        return self.__offset
    def tzname(self, dt=None):
        return self.__name
    def dst(self, dt=None):
        return timedelta(0)
    def __repr__(self):
        return 'FixedOffset(%d)' % (self.utcoffset().total_seconds() / 60)
    def __getinitargs__(self):
        return (self.__offset.total_seconds()/60,)

def parse_isoformat_datetime(isodatetime):
    try:
        return datetime.strptime(isodatetime, '%Y-%m-%dT%H:%M:%S.%f')
    except ValueError:
        pass
    try:
        return datetime.strptime(isodatetime, '%Y-%m-%dT%H:%M:%S')
    except ValueError:
        pass
    pat = r'(.*?[+-]\d{2}):(\d{2})'
    temp = re.sub(pat, r'\1\2', isodatetime)
    naive_date_str = temp[:-5]
    offset_str = temp[-5:]
    naive_dt = datetime.strptime(naive_date_str, '%Y-%m-%dT%H:%M:%S.%f')
    offset = int(offset_str[-4:-2])*60 + int(offset_str[-2:])
    if offset_str[0] == "-":
        offset = -offset
    return naive_dt.replace(tzinfo=FixedOffset(offset))

처음에는 다음을 시도했습니다.

from operator import neg, pos
from time import strptime, mktime
from datetime import datetime, tzinfo, timedelta

class MyUTCOffsetTimezone(tzinfo):
    @staticmethod
    def with_offset(offset_no_signal, signal):  # type: (str, str) -> MyUTCOffsetTimezone
        return MyUTCOffsetTimezone((pos if signal == '+' else neg)(
            (datetime.strptime(offset_no_signal, '%H:%M') - datetime(1900, 1, 1))
          .total_seconds()))

    def __init__(self, offset, name=None):
        self.offset = timedelta(seconds=offset)
        self.name = name or self.__class__.__name__

    def utcoffset(self, dt):
        return self.offset

    def tzname(self, dt):
        return self.name

    def dst(self, dt):
        return timedelta(0)


def to_datetime_tz(dt):  # type: (str) -> datetime
    fmt = '%Y-%m-%dT%H:%M:%S.%f'
    if dt[-6] in frozenset(('+', '-')):
        dt, sign, offset = strptime(dt[:-6], fmt), dt[-6], dt[-5:]
        return datetime.fromtimestamp(mktime(dt),
                                      tz=MyUTCOffsetTimezone.with_offset(offset, sign))
    elif dt[-1] == 'Z':
        return datetime.strptime(dt, fmt + 'Z')
    return datetime.strptime(dt, fmt)

하지만 부정적인 시간대에는 효과가 없었습니다.하지만 Python 3.7.3에서는 정상적으로 동작했습니다.

from datetime import datetime


def to_datetime_tz(dt):  # type: (str) -> datetime
    fmt = '%Y-%m-%dT%H:%M:%S.%f'
    if dt[-6] in frozenset(('+', '-')):
        return datetime.strptime(dt, fmt + '%z')
    elif dt[-1] == 'Z':
        return datetime.strptime(dt, fmt + 'Z')
    return datetime.strptime(dt, fmt)

일부 테스트에서는 출력은 마이크로초의 정밀도로만 다르다는 점에 유의하십시오.내 기계에서 6자리 정밀도를 얻었지만

for dt_in, dt_out in (
        ('2019-03-11T08:00:00.000Z', '2019-03-11T08:00:00'),
        ('2019-03-11T08:00:00.000+11:00', '2019-03-11T08:00:00+11:00'),
        ('2019-03-11T08:00:00.000-11:00', '2019-03-11T08:00:00-11:00')
    ):
    isoformat = to_datetime_tz(dt_in).isoformat()
    assert isoformat == dt_out, '{} != {}'.format(isoformat, dt_out)
def parseISO8601DateTime(datetimeStr):
    import time
    from datetime import datetime, timedelta

    def log_date_string(when):
        gmt = time.gmtime(when)
        if time.daylight and gmt[8]:
            tz = time.altzone
        else:
            tz = time.timezone
        if tz > 0:
            neg = 1
        else:
            neg = 0
            tz = -tz
        h, rem = divmod(tz, 3600)
        m, rem = divmod(rem, 60)
        if neg:
            offset = '-%02d%02d' % (h, m)
        else:
            offset = '+%02d%02d' % (h, m)

        return time.strftime('%d/%b/%Y:%H:%M:%S ', gmt) + offset

    dt = datetime.strptime(datetimeStr, '%Y-%m-%dT%H:%M:%S.%fZ')
    timestamp = dt.timestamp()
    return dt + timedelta(hours=dt.hour-time.gmtime(timestamp).tm_hour)

이 이 '먹다'로 끝나지 않았는지 살펴봐야 합니다.Z 이렇게 할 수 있습니다.%z.

언급URL : https://stackoverflow.com/questions/127803/how-do-i-parse-an-iso-8601-formatted-date

반응형