python 시간 정리

mhlee·2021년 8월 2일
1

1. 들어가면서

우리 모두가 같은 시간대에 산다면 아무 문제가 없을것이다.
2000년 이전까지만해도 대부분 서비스의 범위가 "우리나라"에 한정되어 있었을것이다.
하지만 지금은 어떠한가?
글로벌 서비스를 하지 않는다고 하더라도 클라우드서버(aws, gcp등)를 일반적으로 사용할것이다.
DB, 서버등 한번은 꼭 timezone문제와 마주치게 되어 있다.
이번기회에 python에서 timezone을 어떻게 다룰지 정리하고자 한다.

2. python datetime.now() 타임존

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

3. 어떻게 접근할것인가?

글로벌 서비스가 아니더라도, 클라우드 서비스를 하는경우 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)

우선 리마인더 용도로 간단히 정리해 놓는다.

profile
삽질하는 개발자

0개의 댓글