[python] Python의 ISO 시간 (ISO 8601)

파일이 있습니다. 파이썬에서는 생성 시간을 가져 와서 동부 표준시 (ET) 에서 만들어진 사실을 유지하면서 ISO 시간 (ISO 8601) 문자열 로 변환하고 싶습니다 .

파일의 ctime을 동부 표준 시간대를 나타내는 ISO 시간 문자열로 변환하고 필요한 경우 일광 절약 시간을 고려하는 방법은 무엇입니까?



답변

로컬 ISO 8601 :

import datetime
datetime.datetime.now().isoformat()
>>> 2020-03-20T14:28:23.382748

UTC에서 ISO 8601로 :

import datetime
datetime.datetime.utcnow().isoformat()
>>> 2020-03-20T01:30:08.180856

마이크로 초가없는 ISO 8601에 로컬 :

import datetime
datetime.datetime.now().replace(microsecond=0).isoformat()
>>> 2020-03-20T14:30:43

TimeZone 정보 (Python 3)와 함께 UTC에서 ISO 8601로 :

import datetime
datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat()
>>> 2020-03-20T01:31:12.467113+00:00

마이크로 초가없는 로컬 TimeZone 정보를 사용하여 UTC에서 ISO 8601로 (Python 3) :

import datetime
datetime.datetime.now().astimezone().replace(microsecond=0).isoformat()
>>> 2020-03-20T14:31:43+13:00

TimeZone 정보가 포함 된 ISO 8601에 로컬 (Python 3) :

import datetime
datetime.datetime.now().astimezone().isoformat()
>>> 2020-03-20T14:32:16.458361+13:00

astimezone()utc 시간에 사용할 때 버그가 있습니다. 잘못된 결과가 나타납니다.

datetime.datetime.utcnow().astimezone().isoformat() #Incorrect result

Python 2의 경우 pytz를 참조하십시오 .


답변

다음은 XSD 날짜 / 시간 형식으로 변환하는 데 사용하는 것입니다.

from datetime import datetime
datetime.now().replace(microsecond=0).isoformat()
# You get your ISO string

XSD 날짜 시간 형식 ( xs:dateTime)을 찾을 때이 질문을 보았습니다 . 에서 마이크로 초를 제거해야했습니다 isoformat.


답변

ISO 8601 시간 표현

국제 표준 ISO 8601은 날짜 및 시간에 대한 문자열 표현을 설명합니다. 이 형식의 간단한 두 가지 예는

2010-12-16 17:22:15
20101216T172215

(이 둘은 2010 년 12 월 16 일을 의미하지만) 형식은 초 단위의 해결 시간을 허용하고 시간대를 지정할 수도 있습니다. 이 형식은 물론 Python에 한정되지 않지만 날짜와 시간을 이식 가능한 형식으로 저장하는 데 좋습니다. 이 형식에 대한 자세한 내용은 Markus Kuhn 항목을 참조하십시오 .

이 형식을 사용하여 파일에 시간을 저장하는 것이 좋습니다.

이 표현에서 현재 시간을 얻는 한 가지 방법은 Python 표준 라이브러리의 시간 모듈에서 strftime을 사용하는 것입니다.

>>> from time import strftime
>>> strftime("%Y-%m-%d %H:%M:%S")
'2010-03-03 21:16:45'

datetime 클래스의 strptime 생성자를 사용할 수 있습니다.

>>> from datetime import datetime
>>> datetime.strptime("2010-06-04 21:08:12", "%Y-%m-%d %H:%M:%S")
datetime.datetime(2010, 6, 4, 21, 8, 12)

가장 강력한 것은 Egenix mxDateTime 모듈입니다.

>>> from mx.DateTime.ISO import ParseDateTimeUTC
>>> from datetime import datetime
>>> x = ParseDateTimeUTC("2010-06-04 21:08:12")
>>> datetime.fromtimestamp(x)
datetime.datetime(2010, 3, 6, 21, 8, 12)

참고 문헌


답변

설명서 에서 datetime.isoformat을 찾았습니다 . 원하는 것을하는 것 같습니다.

datetime.isoformat([sep])

Return a string representing the date and time in ISO 8601 format, YYYY-MM-DDTHH:MM:SS.mmmmmm or, if microsecond is 0, YYYY-MM-DDTHH:MM:SS

If utcoffset() does not return None, a 6-character string is appended, giving the UTC offset in (signed) hours and minutes: YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM or, if microsecond is 0 YYYY-MM-DDTHH:MM:SS+HH:MM

The optional argument sep (default 'T') is a one-character separator, placed between the date and time portions of the result. For example,
>>>

>>> from datetime import tzinfo, timedelta, datetime
>>> class TZ(tzinfo):
...     def utcoffset(self, dt): return timedelta(minutes=-399)
...
>>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')
'2002-12-25 00:00:00-06:39'


답변

ISO 8601은를 제외하고 구분 기호가없는 컴팩트 한 표현을 허용 T하므로 빠른 타임 스탬프 문자열을 얻기 위해이 단일 라이너를 사용하고 싶습니다.

>>> datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%S.%fZ")
'20180905T140903.591680Z'

마이크로 초가 필요하지 않은 경우 .%f부품을 제외하십시오 .

>>> datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ")
'20180905T140903Z'

현지 시간 :

>>> datetime.datetime.now().strftime("%Y%m%dT%H%M%S")
'20180905T140903'

편집하다:

이 내용을 좀 더 읽은 후에는 문장 부호를 그대로 두는 것이 좋습니다. RFC 3339 는 모든 사람들이 문장 부호를 사용하면 여러 ISO 8601 문자열과 같은 문장 부호가 그룹으로 분류 될 위험이 없으므로 스타일을 권장합니다. 따라서 호환 문자열에 대한 하나의 라이너는 다음과 같습니다.

>>> datetime.datetime.now().strftime("%Y-%m-%dT%H:%M%SZ")
'2018-09-05T14:09:03Z'


답변

ISO 8601 시간 형식 시간대 이름을 저장하지 않고, 단지 대응 UTC 오프셋은 유지된다.

Python 3에서 UTC 오프셋을 유지하면서 파일 ctime을 ISO 8601 시간 문자열로 변환하려면 다음을 수행하십시오.

>>> import os
>>> from datetime import datetime, timezone
>>> ts = os.path.getctime(some_file)
>>> dt = datetime.fromtimestamp(ts, timezone.utc)
>>> dt.astimezone().isoformat()
'2015-11-27T00:29:06.839600-05:00'

이 코드는 로컬 시간대가 동부 표준시 (ET)이고 시스템이 지정된 POSIX 타임 스탬프 ( ts)에 대해 올바른 UTC 오프셋을 제공 한다고 가정합니다 . 즉, Python이 시스템의 히스토리 시간대 데이터베이스에 액세스하거나 시간대가 주어진 날짜에 동일한 규칙.

휴대용 솔루션이 필요한 경우 tz 데이터베이스에 대한 액세스를 제공 하는 pytz모듈사용하십시오 .

>>> import os
>>> from datetime import datetime
>>> import pytz  # pip install pytz
>>> ts = os.path.getctime(some_file)
>>> dt = datetime.fromtimestamp(ts, pytz.timezone('America/New_York'))
>>> dt.isoformat()
'2015-11-27T00:29:06.839600-05:00'

이 경우 결과는 동일합니다.

시간대 이름 / 약어 / 구역 ID가 필요한 경우 별도로 저장하십시오.

>>> dt.astimezone().strftime('%Y-%m-%d %H:%M:%S%z (%Z)')
'2015-11-27 00:29:06-0500 (EST)'

참고 : 아니요, :UTC 오프셋 및 EST시간대 약어는 ISO 8601 시간 형식의 일부가 아닙니다. 고유하지 않습니다.

동일한 라이브러리의 다른 라이브러리 / 다른 버전은 동일한 날짜 / 시간대에 대해 다른 시간대 규칙을 사용할 수 있습니다. 미래 날짜 인 경우 규칙을 아직 알 수 없습니다. 즉, 동일한 UTC 시간은 사용하는 규칙에 따라 다른 현지 시간에 해당 할 수 있습니다. ISO 8601 형식으로 시간을 절약하면 UTC 시간과 플랫폼에서 사용 중인 현재 시간대 규칙에 해당하는 현지 시간이 보존 됩니다. . 규칙이 다른 다른 플랫폼에서 현지 시간을 다시 계산해야 할 수도 있습니다.


답변

os.stat파일 생성 시간과 형식 time.strftime및 조합을 얻으려면 다음 을 사용해야 합니다 time.timezone.

>>> import time
>>> import os
>>> t = os.stat('C:/Path/To/File.txt').st_ctime
>>> t = time.localtime(t)
>>> formatted = time.strftime('%Y-%m-%d %H:%M:%S', t)
>>> tz = str.format('{0:+06.2f}', float(time.timezone) / 3600)
>>> final = formatted + tz
>>>
>>> final
'2008-11-24 14:46:08-02.00'