파일이 있습니다. 파이썬에서는 생성 시간을 가져 와서 동부 표준시 (ET) 에서 만들어진 사실을 유지하면서 ISO 시간 (ISO 8601) 문자열 로 변환하고 싶습니다 .
파일의 ctime을 동부 표준 시간대를 나타내는 ISO 시간 문자열로 변환하고 필요한 경우 일광 절약 시간을 고려하는 방법은 무엇입니까?
파일이 있습니다. 파이썬에서는 생성 시간을 가져 와서 동부 표준시 (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를 참조하십시오 .
.isoformat()
구분자 매개 변수를 사용할 수 있습니다 ( 'T'이외의 다른 것을 원하는 경우) :.isoformat(' ')
It is permitted to omit the 'T' character by mutual agreement.
다음은 XSD 날짜 / 시간 형식으로 변환하는 데 사용하는 것입니다.
from datetime import datetime
datetime.now().replace(microsecond=0).isoformat()
# You get your ISO string
XSD 날짜 시간 형식 ( xs:dateTime
)을 찾을 때이 질문을 보았습니다 . 에서 마이크로 초를 제거해야했습니다 isoformat
.
xs:date
XSD / XML 스타일 시트 를 의미한다고 생각 합니다.
xs:dateTime
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)
참고 문헌
2018-05-25
2018-05-25T12:16:14+00:00
2018-05-25T12:16:14Z
20180525T121614Z
설명서 에서 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'
2019-02-23T04:02:04.051Z
과 함께 생성 됩니다new Date().toISOString()
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'
내가 틀렸다면 정정하십시오.하지만 UTC와의 오프셋은 일광 절약 시간에 따라 변경됩니다. 그래서 당신은 사용해야합니다
tz = str.format('{0:+06.2f}', float(time.altzone) / 3600)
또한 표시가 달라야한다고 생각합니다.
tz = str.format('{0:+06.2f}', -float(time.altzone) / 3600)
나는 틀릴 수 있지만 그렇게 생각하지 않습니다.
estani의 탁월한 답변에 작은 변형 추가
TimeZone 및 마이크로 초 정보가 없는 ISO 8601에 로컬 (Python 3) :
import datetime, time
utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone
utc_offset = datetime.timedelta(seconds=-utc_offset_sec)
datetime.datetime.now().replace(microsecond=0, tzinfo=datetime.timezone(offset=utc_offset)).isoformat()
샘플 출력 :
'2019-11-06T12:12:06-08:00'
이 출력은 Javascript Date
와 C # DateTime
/ 둘 다로 구문 분석 할 수 있는지 테스트했습니다DateTimeOffset
이 기능을 개발했습니다.
def iso_8601_format(dt):
"""YYYY-MM-DDThh:mm:ssTZD (1997-07-16T19:20:30-03:00)"""
if dt is None:
return ""
fmt_datetime = dt.strftime('%Y-%m-%dT%H:%M:%S')
tz = dt.utcoffset()
if tz is None:
fmt_timezone = "+00:00"
else:
fmt_timezone = str.format('{0:+06.2f}', float(tz.total_seconds() / 3600))
return fmt_datetime + fmt_timezone
import datetime, time
def convert_enddate_to_seconds(self, ts):
"""Takes ISO 8601 format(string) and converts into epoch time."""
dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+\
datetime.timedelta(hours=int(ts[-5:-3]),
minutes=int(ts[-2:]))*int(ts[-6:-5]+'1')
seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0
return seconds
>>> import datetime, time
>>> ts = '2012-09-30T15:31:50.262-08:00'
>>> dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+ datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:]))*int(ts[-6:-5]+'1')
>>> seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0
>>> seconds
1348990310.26