우리 모두가 같은 시간대에 산다면 아무 문제가 없을것이다.
2000년 이전까지만해도 대부분 서비스의 범위가 "우리나라"에 한정되어 있었을것이다.
하지만 지금은 어떠한가?
글로벌 서비스를 하지 않는다고 하더라도 클라우드서버(aws, gcp등)를 일반적으로 사용할것이다.
DB, 서버등 한번은 꼭 timezone문제와 마주치게 되어 있다.
이번기회에 python에서 timezone을 어떻게 다룰지 정리하고자 한다.
datetime.now()는 실행환경의 시간을 출력해주지만, 타임존 정보가 없다.
from datetime import datetime
from pytz import timezone, utc
now = datetime.now()
now.strftime('%Y-%m-%d %H:%M:%S %Z%z')
결과
'2021-08-02 20:08:06 '
이번에는 동일하게 현재시간을 구하되, 명시적으로 utc기준으로 시간을 구한다.
from datetime import datetime
from pytz import timezone, utc
now = datetime.now()
utc.localize(now).strftime('%Y-%m-%d %H:%M:%S %Z%z')
결과
'2021-08-02 20:08:07 UTC+0000'
python 타임존에 대한 문제는 아래 블로그에 잘 정리되어 있다.
https://spoqa.github.io/2019/02/15/python-timezone.html
글로벌 서비스가 아니더라도, 클라우드 서비스를 하는경우 UTC를 기준으로 하는것을 권장한다.
시간정보는 호불호가 있는데, 개인적으로 unixtime(long 형)을 저정하는것을 선호한다.
즉, 서버(DB)에는 UTC기준 unixtime만 저장하고 실제 서비스 레이어에서 필요한 타임존/포맷으로 변경해서 출력하는것이다.
아래는 python 타임존을 정리하면서 추가한 코드이다.
기본적으로 UTC를 사용하되, 필요한 타임존으로 시간대를 변경하는 전략이다.
from datetime import datetime, timedelta
from pytz import timezone, utc
FMT = '%Y-%m-%d %H:%M:%S %Z%z'
KST = timezone('Asia/Seoul')
def now_as_unixtime():
import time
return int(time.time())
def now():
return utc.localize(datetime.utcnow())
def kst_now():
return now().astimezone(KST)
def kst(dt: datetime):
return dt.astimezone(KST)
def unixtime_to_datetime(unixtime: int):
return utc.localize(datetime.fromtimestamp(unixtime))
def date_format(dt: datetime):
return dt.strftime(FMT)
def date_format_of(dt: datetime, format: str):
return dt.strftime(format)
우선 리마인더 용도로 간단히 정리해 놓는다.