Python UTC -6 to KST (UTC +9)

개발 환경

  • Python 3.6.5
  • PyCharm on Mac

KST(한국 표준시)는 UTC/GMT에서 +9, 9시간을 더한 시간과 같다. 흔한 케이스는 아니겠지만 글의 업로드 시간으로 다음과 같은 데이터를 받았다.

2019-04-14T02:14:30-06:00

한국은 UTC 기준 +9이기 때문에 -6은 한국 시각이 아닌 것을 알 수 있다. 중요한 정보는 아니지만 궁금하니 지도로 UTC -6은 어딘지 한번 구경해보자.

협정_세계시

가령, 미국 로스앤젤레스에 거주하는 사용자가 2019년 4월 14일 오전 8시 14분 30초경에 쓴 글이다. 이제 한국인에게 읽기 편한 KST로 변경하기 위해 Python을 사용해 시간 문자열을 객체로 변환해보자.

from datetime import datetime

time_str = '2019-04-14T02:14:30-06:00'
updated_time = datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%S%z')
print(updated_time)

다음을 실행하면 아래의 결과가 출력된다.

ValueError: time data '2019-04-14T02:14:30-06:00' does not match format '%Y-%m-%dT%H:%M:%S%z'

지정한 시간 포맷이 맞지 않는다는 ValueError이다. 유명한 서비스의 시간 문자열의 포맷이 이상한 걸까?

time_str = '2019-04-14T02:14:30-06'
updated_time = datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%S%z')
print(updated_time)

시간 문자열을 조금 변경해서 해봤지만 마찬가지다.

데이터와 포맷을 여러번 변경해본 결과, 원인은 %z이다.(%Z: Time zone name) 데이터의 포맷이 맞는지 확인하기 위해서 시간 관련된 데이터 교환을 다루는 국제 표준인 ISO 8601를 살펴보았다.

기술 중인 시간이 UTC보다 한 시간 앞선다면 (겨울 동안의 베를린 지역의 시간처럼), 지역 지정자(zone designator)는 “+01:00”, “+0100” 혹은 간단히 “+01″가 될 수 있다.
from: https://ko.wikipedia.org/wiki/ISO_8601

ISO8601에는 적합한 날짜 포맷이며 두 가지(“+01:00”, “+0100”)로 표현 가능하다. 다음으로 datetime.strptime 공식 문서를 확인해보자.
strptime: 날짜 및 시간 문자열을 특정 포맷 형태의 datetime으로 변경
strftime: 특정 포맷 형태의 datetime으로 변경

%z : UTC offset in the form +HHMM or -HHMM (empty string if the object is naive). (empty), +0000, -0400, +1030

위와 같이 %z 지시자는 ‘:’을 지원하지 않는다. (앗!) 정확한 원인을 찾은듯하다.

콜론(:)을 지원하는 오픈소스 라이브러리를 찾던지 아니면 문자열을 수정해서 해결해야 한다. 파이썬에 익숙하지 않기 때문에 학습을 위해서 후자를 선택했다.

print(updated_time)
print(updated_time.rsplit(':', 1))
print(''.join(updated_time.rsplit(':', 1))

>>> 2019-04-14T02:14:30-06:00
>>> ['2019-04-14T02:14:30-06', '00']
>>> 2019-04-14T02:14:30-0600

rsplit를 사용해 오른쪽에서 첫 번째 콜론(:)을 기준으로 문자열을 나눈 다음 문자열 배열을 다시 합쳐주면 원하는 문자열 ‘2019-04-14T02:14:30-0600’ 만들 수 있다. 그리고 다시 처음처럼 datetime을 생성하자.

kst_updated_time =
datetime.strptime(''.join(time_str.rsplit(':', 1), '%Y-%m-%dT%H:%M:%S%z')
print(kst_updated_time)
>>> 2019-04-14T02:14:30-0600

정상적인 datetime 인스턴스가 출력된다. 이제 한국 타임존으로 변경해서 문자열을 출력해보자.

from pytz import timezone

KST = timezone('Asia/Seoul')

print(kst_updated_time.astimezone(KST))
print(kst_updated_time.astimezone().tzinfo)
print(kst_updated_time.astimezone().strftime('%Y-%m-%d %H:%M:%S'))

>>> 2019-04-14 17:14:30+09:00
>>> KST
>>> 2019-04-14 17:14:30

타임존을 한국 표준시(KST)로 설정하면 원했던 한국 표준시 UTC +9 시간으로 출력할 수 있다.