세 줄 요약

  • 글로벌 날짜,시간 표준 포멧은 ISO-8601 아니면 RFC-3999.
  • 파이썬 3.8 이후 버전 부터는 ISO-8601 포멧의 문자형/데이터 타입을 보다 ‘잘’ 전환해주는 함수가 추가됨
  • 또한 3.9 부터는 zoneinfo라는게 생겨서 pytz 를 설치하지 않고 타임 존 변경 가능

오랜만의 코딩

오랜만에 코딩을 하다보니, 코딩하려는 메인 함수보다 서브 함수들에 시간을 많이 썼다. 요리를 예로 들면 요리하는 시간보다, 무 좀 썰라고 하니 ‘요즘 무는 생긴게 예전이랑 다르네? 어떻게 썰지?’ 이런 느낌 ㅋㅋ

아무튼 OpenAIChatGPT 서비스는 많이들 이용 할텐데, 요즘 이용자가 많아져서 그런가 종종 다운이 된다. https://status.openai.com/api/v2/ 에서 현재 상황 및 앞으로의 패치 계획 등을 알려주는데, 매번 들어가서 확인하기는 상당히 번거롭다. 보통은 장애가 발생하면, ‘이거 지금 장애 발생한거 맞지?’ 하면서 들어가는 정도..

따라서 단순 RestAPI 로 위의 주소를 찌른 후 파싱해서 나한테 상관있는 것만 알림을 받으려고 파이썬 코드를 짰다. 그런데 OpenAI가 리포트 하는 타임 존이 계속 바뀐다는걸 알게되었다. 그래서 한국 시간으로 일관적이게 리포트 하도록 코드를 수정했다.

예전처럼 https://strftime.org/ 같은 사이트들을 참고하며 손파싱을 하다가, ‘이게 맞나?’ 란 생각이 들었다. 뭔가 편하려고 코딩하는데 불편하고, 시간도 많이 들고.. 구글링 해보니 요즘 파이썬은 아주 좋은 기능이 있어서 정리해본다.

fromisoformat / isoformat

OpenAI는 ISO-8601("2023-11-15T21:02:11.566-08:00") 포멧으로 시간을 리포트하는데, 이러한 포멧의 문자열 혹은 객체를 바로 변환해주는 기본 함수가 있다. 제목에도 써있는 fromisoformat / isoformat 이다. 나는 3rd-party 라이브러리를 쓰지 않는 편인데, 유지/보수가 안되는 경우가 종종 있기 때문이다. 정말 필요하다면 신뢰 할 수 있는 maintainer가 있는 것을 쓰려고 노력한다.

ISO-8601 포멧의 문자열과 객체를 변환하는 코드

>>> import datetime
>>> data = datetime.datetime.fromisoformat("2023-11-15T21:02:11.566-08:00")
>>> data
datetime.datetime(2023, 11, 15, 21, 2, 11, 566000, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=57600)))
>>> data.isoformat()
'2023-11-15T21:02:11.566000-08:00'
>>>

이 함수들을 이용하면 isoformat의 문자형 날짜/시간을 한 번에 aware object로 변환 할 수 있다.

날짜/시간 object가 타임존을 내포하고 있으면 aware object, 내포하지 않으면 naive object 라고 한다. https://docs.python.org/3.9/library/datetime.html#aware-and-naive-objects

간단한 코드니까 보면 바로 알겠지만 정리를 하자면, fromisoformatISO-8601 포멧의 문자열을 datetime object로 변환해준다. isoformat 은 그 반대이다. (참고 : https://docs.python.org/3.9/library/datetime.html#datetime.datetime.fromisoformat)

zoneinfo and astimezone

앞서 언급했듯이 원래 목적은 한국 시간으로 변경하는 것이었기 때문에 타임 존 변경도 찾아봤다.

처음에는 역시 pytz 가 압도적으로 많이 나왔는데, 역시나 최신 버전에는 zoneinfo 라는 녀석이 추가 되었다. 이녀석은 타임존 정보를 참고하여 입력하면 tzinfo에 ‘연결’되는 녀석이다. 처음엔 나도 이게 object 인 줄 알고 반환받으려 노력했는데.. 안된다. 단순 연결되는 녀석 같다.

(만약 제가 틀렸다면 댓글 부탁드립니다.)

위 코드에 이어서..

>>> import zoneinfo
>>> data_kst = data.astimezone(zoneinfo.ZoneInfo(key='Asia/Seoul'))
>>> data_kst.isoformat()
'2023-11-16T14:02:11.566000+09:00'

타임존을 변환하기 위해서는 astimezone 이라는 함수를 썼다.

마무리

대부분 날짜 형식은 표준인 ISO-8601 를 따를테니, 위의 함수들을 잘 기억하거나 정리하면 날짜/시간 관련된 코드는 바로 구현 할 수 있을 것 같다.

테크 블로그라는게, 최소 ‘나라도’ 봐야하므로, 아니 ‘내가’ 보기 위해서 하는거니까 정리정리 ^^

댓글남기기