ISO 8601은 날짜 표기에 대한 국제 표준으로서 사람이 읽기에도 무리가 없고, 컴퓨터가 처리하기에도 용이하다.
가장 중요한 점은 타임존 정보가 포함되어 있기 때문에 세계 어느 곳에서 사용하더라도 혼동이 발생하지 않는다는 점이다.
다음 예제를 참고할수 있다.
https://github.com/terzeron/PythonTest/blob/master/simple_grammar/iso8601_test.py
이 중에서 중요한 코드는 다음과 같다.
#!/usr/bin/env python
from datetime import datetime
# 현재 시각을 ISO 8601 포맷으로 출력하는 방법
print("astimezone, isoformat=", datetime.now().astimezone().isoformat())
# 현재 시각을 초단위까지만 출력하는 방법
print("astimezone, timespec, isoformat=", datetime.now().astimezone().isoformat(timespec="seconds"))
astimezone, isoformat= 2021-02-24T16:15:12.630490+09:00
astimezone, timespec, isoformat= 2021-02-24T16:15:12+09:00
isoformat()을 적극 활용해야 한다.
# ISO 8601을 따르는 datetime 문자열을 파싱하여 datetime.datetime 객체 얻는 방법
import dateutil.parser
datetime_str = "2019-07-09T14:07:17+09:00"
dt = dateutil.parser.parse(datetime_str)
print("datetime=", dt)
datetime.now()로 객체를 생성해보면 타임존 정보가 없는 것을 알 수 있다.
>>> datetime.now()
datetime.datetime(2023, 2, 22, 16, 32, 21, 787161)
이렇게 얻은 값에 astimezone()을 덧붙여서 타임존을 달아주는 방법이 있긴 하지만, 생성 단계에서 타임존을 달아주는 방법이 더 바람직하다.
import tzlocal
local_tz = tzlocal.get_localzone()
datetime.now(local_tz)
추가적인 패키지 의존성도 있고 코드량도 늘어나기 좋아보이지 않지만, 이후에 이 datetime 객체를 이용할 때 타임존이 달려있기 때문에 문자열로 포매팅하거나 UTC로 전환하기가 편리하다.
import tzlocal
local_tz = tzlocal.get_localzone()
dt = datetime.now(local_tz)
print(dt.isoformat(timespec="seconds"))
2023-02-22T16:24:29+09:00
import tzlocal
import pytz
local_tz = tzlocal.get_localzone()
dt = datetime.now(local_tz)
print(dt.astimezone(pytz.UTC).isoformat(timespec="seconds")
2023-02-22T07:40:41+00:00
dateutil 모듈은 다음과 같이 python-dateutil 패키지로 설치해야 함
pip install python-dateutil