ISO 8601 형식의 날짜를 해석하려면 어떻게 해야 합니까?
RFC 3339 문자열을 다음과 같이 해석해야 합니다."2008-09-03T20:56:35.450686Z"
Python Python's »에datetime
discloss.discloss.
Python 스탠다드 라이브러리에서 찾았지만, 그다지 편리하지 않습니다.
어떻게 하면 좋을까요?
isoparse
python-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를 사용하려고 .또한 이 형식을 사용하여%z
RFC 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
'programing' 카테고리의 다른 글
Python에서 람다로 정렬하는 방법 (0) | 2022.09.22 |
---|---|
HashSet.removeAll 메서드가 놀라울 정도로 느리다. (0) | 2022.09.22 |
AngularJS 1.2$injector: 모듈러 (0) | 2022.09.22 |
JavaScript를 사용하여 여러 키를 동시에 눌렀는지 어떻게 검출합니까? (0) | 2022.09.22 |
int[] 어레이와 int 어레이의 차이[] (0) | 2022.09.15 |