파이썬의 시간을 다루기위해선 datetime모듈을 불러와 사용합니다.
많은 언어와 프레임워크에서 시간을 다룰때 문제가 있습니다.
바로 timezone에 관련한 것 입니다. 해당 시간이 어느나라 어느 지역의 시간인지에 대한 정보이죠.
파이썬에서 이를 이해하고 컨트롤하기위해서는 aware & naive에 대해 좀더 명확히 이해하려합니다.
aware & naive
aware(알고있는)
timezone의 정보를 가지고있는 datetime객체
naive(순진한)
timezone의 정보를 모르는 datetime 객체
좀더 정확하게 파이썬 공식문서에는 두 객체의 정의를 아래와같이 정의내리고 있습니다.
Objects of the date type are always naive.
An object of type time or datetime may be aware or naive.
A datetime object d is aware if both of the following hold:
1. d.tzinfo is not None
2. d.tzinfo.utcoffset(d) does not return None
Otherwise, d is naive.
해석하자면
d는 datetime객체입니다.
d.tzinfo의 리턴값이 None이거나 d.tzinfo.utcoffset(d) 리턴값이 None인경우 naive객체입니다.
datetime객체로 현재시간 구해보기
from datetime import datetime
now = datetime.now()
utc_now = datetime.utcnow()
print(now)
# datetime.datetime(2023, 1, 5, 16, 54, 55, 89653)
print(utc_now)
#datetime.datetime(2023, 1, 5, 7, 55, 1, 540080)
현재시간을 구하는 now()메서드와 현재 utc시간을 구하는 utcnow()메서드를 사용하여 현재시간을 구해보았습니다.
(정확하지않지만 datetime.now()는 로컬타임 == 컴퓨터시간 을 기준으로 구합니다.)
두 객체중 utc_now는 utc의시간입니다. 그렇다면 timezone을 가지고 있을까요?
tzinfo를 활용해서 확인해보겠습니다.
now.tzinfo
# None
now.utcoffset()
# None
utc_now.tzinfo
# None
utc_now.utcoffset()
# None
두가지다 None으로 됩니다. utc_now는 현재 utc시간을 가지고왔지만 이 시간이 utc라는 표기를 안해준겁니다.
이게 바로 naive객체입니다.
aware객체 만들어보기
datetime객체에 timezone을 주입하기위해서는 str값이 아닌 timezone과 관련된 객체를 주입해줘야합니다.
datetime.now('Asia/Seoul')
# raise
datetime.now(timezone)
# Ok
timezone객체를 만들기위해 우선적으로 pytz을 설치하고 진행해줍니다.
pip install pytz
import pytz
from datetime import datetime
utc = pytz.utc
# <UTC>
kor = pytz.timezone('Asia/Seoul')
# <DstTzInfo 'Asia/Seoul' LMT+8:28:00 STD>
utc_time = datetime.now(utc)
# datetime.datetime(2023, 1, 5, 8, 0, 27, 129726, tzinfo=<UTC>)
kor_time = datetime.now(kor)
'''
datetime.datetime(
2023, 1, 5, 16, 59, 39, 320059,
tzinfo=<DstTzInfo 'Asia/Seoul' KST+9:00:00 STD>
)
'''
utc_time.tzinfo
# <UTC>
utc_time.utcoffset()
# datetime.timedelta(0)
kor_time.tzinfo
# <DstTzInfo 'Asia/Seoul' KST+9:00:00 STD>
kor_time.utcoffset()
# datetime.timedelta(seconds=32400)
위와 같이 datetime객체 자체에도 timezone에 대한 정보가 포함되어있으며
time.tzinfo or time.utcoffset()의 리턴값또한 명확하게 반환합니다.
( utcoffset()은 utc시간과의 차이를 의미합니다. )
'Python > 기초문법' 카테고리의 다른 글
lambda expressions & list Comprehensions (set,tuple,dict) (0) | 2022.06.09 |
---|---|
Package & Module (0) | 2022.05.29 |
function parameter 순서 (with arguments 처리 순서) (0) | 2022.05.29 |
Set vs Dictionary & List vs Tuple (0) | 2022.05.26 |
2달 공부하고 다시쓰는 파이썬 기본 문법 (0) | 2022.05.25 |