programing

Python의 ISO 시간(ISO 8601)

bestcode 2022. 11. 8. 21:51
반응형

Python의 ISO 시간(ISO 8601)

파일이 있어요.Python에서는 Eastern Time Zone(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

UTC에서 ISO 8601(타임존 정보 포함)(Python 3):

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

UTC에서 ISO 8601까지(마이크로초 없음) 로컬 시간대 정보 포함(Python 3)

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

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를 참조하십시오.

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 문자열과 같은 문자열이 구두점 시 그룹으로 정렬될 위험이 없기 때문에 이 스타일을 권장합니다.따라서 준거 스트링의 1개의 라이너는 다음과 같습니다.

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

XSD datetime 형식으로 변환하는 방법은 다음과 같습니다.

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일을 의미하지만, 이 형식에서는 1초 미만의 해결 시간 및 시간대를 지정할 수도 있습니다.이 포맷은 Python 고유의 포맷은 아니지만 날짜와 시간을 휴대용 포맷으로 저장하기에 좋습니다.이 포맷에 대한 자세한 내용은 Markus Kun 엔트리에서 확인할 수 있습니다.

이 형식을 사용하여 시간을 파일에 저장할 것을 권장합니다.

이 표현에서 현재 시간을 얻는 한 가지 방법은 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'

날짜 전용 솔루션을 찾고 있는 고객에게는 다음과 같은 이점이 있습니다.

import datetime

datetime.date.today().isoformat()

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'

이 코드에서는 로컬타임존이 East Time Zone(ET; 동부 표준시)이며 시스템이 지정된 POSIX 타임스탬프에 대해 올바른 UTC 오프셋을 제공하는 것을 전제로 하고 있습니다.ts 할 수 이 있는 경우입니다.

휴대용 솔루션이 필요한 경우 tz 데이터베이스에 액세스할 수 있는 모듈을 사용합니다.

>>> 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에서ESTISO 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)

내가 틀릴 수도 있지만, 난 그렇게 생각하지 않아.

표준 RFC-3339(밀리초 단위)

LoRa 어플리케이션에서는 이 포맷의 시간이 필요했기 때문에 이 방법을 생각해 냈습니다.이 방법이 도움이 되었으면 합니다.

from datetime import datetime
from time import strftime


# Get the current time in the format: 2021-03-20T16:51:23.644+01:00
def rfc3339_time_ms():
        datetime_now = datetime.utcnow()
        # Remove the microseconds
        datetime_now_ms = datetime_now.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3]
        # Add the timezone as "+/-HHMM", and the colon in "+/-HH:MM"
        datetime_now_ms_tz = datetime_now_ms + strftime("%z")
        rfc3339_ms_now = datetime_now_ms_tz[:-2] + ":" + datetime_now_ms_tz[-2:]
        # print(f"Current time in ms in RFC-3339 format: {rfc3339_ms_now}")
        return rfc3339_ms_now

에스타니의 뛰어난 답변에 작은 변형을 더하다

ISO 8601의 로컬(TimeZone 포함, 마이크로초 정보 없음) (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# c C#DateTime/DateTimeOffset

심플한 생활을 실현해 주세요.

  1. UTC 시간 사용
  2. 마이크로초
  3. 한 줄의 코드

f"{datetime.datetime.utcnow().isoformat()[:-3]}Z"

출력:

2022-02-25T02:08:40.684Z

Jarek에 동의하며 ISO 오프셋 구분 문자는 콜론이기 때문에 최종 답변은 다음과 같습니다.

isodate.datetime_isoformat(datetime.datetime.now()) + str.format('{0:+06.2f}', -float(time.timezone) / 3600).replace('.', ':')

이 기능을 개발했습니다.

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

언급URL : https://stackoverflow.com/questions/2150739/iso-time-iso-8601-in-python

반응형