코드로 우주평화

Python _ zoneinfo 사용법, ZoneInfo 와 pytz 차이 본문

나는 이렇게 학습한다/Language

Python _ zoneinfo 사용법, ZoneInfo 와 pytz 차이

daco2020 2022. 10. 27. 17:40
반응형

ZoneInfo 을 사용하면 기존 pytz를 사용하지 않고도 타임존을 사용할 수 있다! (*ZoneInfo 는 Python3.9 버전 이상부터 사용가능)

 

 

'ZoneInfo' vs 'pytz'

그렇다면 ZoneInfo 와 pytz 는 어떤 차이가 있을까?

 

 

 

우선 ZoneInfo 는 따로 설치할 필요가 없는 빌트인 클래스이므로 다음처럼 간단하게 불러올 수 있다.

from zoneinfo import ZoneInfo

 

 

 

ZoneInfo 와 pytz 를 각각 사용해 현재시간을 가져와보자.

pytztz = timezone("Asia/Seoul")
zonetz = ZoneInfo("Asia/Seoul")

print(datetime.datetime.now(tz=pytztz).tzname())
print(datetime.datetime.now(tz=zonetz).tzname())

"""
KST
KST
"""

둘다 정상적으로 KST(korean standard time)이 적용된 것을 확인할 수 있다.

 

 

 

그렇다면 strptime을 사용한 경우도(문자열 -> datetime) 비교해보자.

date = datetime.datetime.strptime("202201010101", "%Y%m%d%H%M%S")

print(date.replace(tzinfo=pytztz))
print(date.replace(tzinfo=zonetz))
"""
<print result>
2022-01-01 01:00:01+08:28
2022-01-01 01:00:01+09:00
"""

pytz로 타임존을 변경했을 땐, 결과가 +08:28 로 표시되는 것을 볼 수 있다. 👿 (*replace 메서드를 사용한 이유는, strptime 에는 타임존을 입력할 수 없기 때문에 객체 생성 후 타임존을 변경해주어야 한다)

 

 

이 둘의 tzname을 출력해보면 다음처럼 차이가 있다.

print(date.replace(tzinfo=pytztz).tzname())
print(date.replace(tzinfo=zonetz).tzname())
"""
<print result>
LMT
KST
"""

pytz는 replace로 타임존을 바꿀 경우 LMT(local mean time)를 적용하기 때문에 스탠다드 시간과 다른 결과가 나온다.

 

 

그래서 보통은 pytz에서 replace 사용을 지양하고 .localize 메서드를 사용하여 타임존을 변경한다.

 

e. g.

print(pytztz.localize(date)) # >>> 2022-01-01 01:00:01+09:00
print(pytztz.localize(date).tzname()) # >>> KST

 

반면, zoneinfo는 replace를 그대로 사용해 더 직관적으로 타임존을 변경할 수 있다!

 

 

 

정리

ZoneInfo 와 pytz 는 비슷하면서도 차이가 있음을 확인했다.

 

pytz 의 특별한 기능을 사용하는게 아니라면 외부 의존성을 줄일 수 있다는 점에서는 ZoneInfo을 사용하는 것이 좋아보인다. 만약 지금 사용하고 있는 Python 버전이 3.9 이상이라면 ZoneInfo 사용을 고려해보자!

 

 

 

zoneinfo 에 대해 더 자세히 알고 싶은 분들을 위해 공식문서 링크를 남긴다.

 

 

zoneinfo — IANA 시간대 지원 — Python 3.11.0 문서

zoneinfo — IANA 시간대 지원 zoneinfo 모듈은 원래 PEP 615에서 지정된 대로 IANA 시간대 데이터베이스를 지원하기 위한 구상 시간대 구현을 제공합니다. 기본적으로, zoneinfo는 가능하면 시스템의 시간

docs.python.org

 

반응형