프로그래밍/Python

datetime 다루기 (날짜 연산 및 timezone)

채윤아빠 2020. 12. 23. 17:59
728x90
반응형

 

문자열에서 datetime 객체로 변환

문자열에서 날짜를 추출하여 datetime 객체를 얻기 위해서는 datetime.strptime() 클래스 함수를 이용합니다.

import datetime as dt

date_string = '2020-12-10T04:26:45'
date = dt.datetime.strptime(date_string, '%Y-%m-%dT%H:%M:%S')

print(date)

# 실행 결과
# 2020-12-10 04:26:45

datetime.strptime() 클래스 함수에서 지정할 수 있는 더 자세한 날짜 형식은 아래 참고자료 ( "datetime — 기본 날짜와 시간 형" )를 확인해 보시면 됩니다.


datetime 연산 (날짜 및 시간 연산)

날짜 연산은 datetime.timedelta 클래스를 이용합니다.

 

입력받은 시각 정보에 9시간을 더하려면, 다음과 같이 합니다.

import datetime as dt

date_string = '2020-12-10T04:26:45'
date = dt.datetime.strptime(date_string, '%Y-%m-%dT%H:%M:%S')

print(date)
date += dt.timedelta(hours = 9)
print(date)

# 실행 결과
# 2020-12-10 04:26:45
# 2020-12-10 13:26:45

datetime의 timezone 설정하기

날짜와 시간 객체는 시간대역 정보를 포함하는지에 따라 《어웨어(aware)》와 《나이브(naive)》로 나뉩니다.

 

어웨어(aware) 객체는 시간대역(timezone) 정보를 포함하고 있고, 나이브(naive)는 포함하고 있지 않습니다.

import datetime as dt

kst_timezone = dt.timezone(dt.timedelta(hours=9), 'KST')
now_utc = dt.datetime.now(dt.timezone.utc)
now_kst = dt.datetime.now(kst_timezone)
now_none = dt.datetime.now()

print(now_utc)
print(now_utc.tzinfo)

print(now_kst)
print(now_kst.tzinfo)
print('to UTC = ', now_kst.astimezone(dt.timezone.utc))

print(now_none)
print(now_none.tzinfo)
print('to UTC = ', now_none.astimezone(dt.timezone.utc))
print('to KST = ', now_none.astimezone(kst_timezone))

실행 결과는 다음과 같습니다.

2020-12-22 07:39:24.468937+00:00
UTC
2020-12-22 16:39:24.468937+09:00
KST
to UTC =  2020-12-22 07:39:24.468937+00:00
2020-12-22 16:39:24.468937
None
to UTC =  2020-12-22 07:39:24.468937+00:00
to KST =  2020-12-22 16:39:24.468937+09:00

위 예에서는 "dt.datetime.now()"와 같이 timezone 정보 없이 호출하면 나이브(naive) 형식의 datetime 객체가 반환되고, "datetime.tzinfo == None"로 설정되어 있습니다.

 

나이브(naive) 형식의 datetime을 astimezone() 함수를 이용하면 timezone 정보를 포함하고 있는 어웨어(aware) datetime 객체로 변환할 수 있습니다. 위 예에서는 "now_none" 나이브 형식의 datetime 객체를 kst_timezone 및 utc 시간대역으로 변환하여 출력하는 예제를 보여줍니다.

 

출력된 시각의 형태를 유심히 보면, 나이브(naive) 형식의 datetime은 시간대역을 유추할 수 있는 UTC 오프셋 정보(±HHMM[SS[.ffffff]] 형태)가 제공되지 않고 "2020-12-22 16:39:24.468937"과 같이 날짜 및 시각 정보만 출력됩니다. 시간대역 정보가 포함된 어웨어(aware) datetime 객체들은 UTC 오프셋 정보가 포함되어 있습니다.


참고자료