- UTC(Coordinated Universal Time) : 협정세계시, 시간대와 독립적으로 시간을 나타낼 때 쓰는 표준
- 그리니치 표준시나 영국의 GMT로 알려져 있음.
- UTC에서는 일광절약시간이 존재하지 않기 때문에 산술적으로 계산하는데 아무런 문제가 없어서, 일광절약시간 변환, 국가가 시간대를 변경하는 경우에도 문제 발생 X
- 단, UTC는 인간에게는 적합하지 않다.
- 파이썬에서 UTC <-> 지역 시간 변환하는 방법은 time, datetime 모듈.
- time 보다는 datetime 내장 모듈과 pytz 라는 패키지를 활용하는 걸 추천함.
Time
- time 모듈에 있는 localtime 함수를 사용해 유닉스 타임스탬프 -> 호스트 컴퓨터의 시간대에 맞는 지역 시간으로 변환
- 지역 시간은 strftime 함수를 사용해 이해하기 쉬운 표현으로 출력
- 유닉스 타임 스탬프 -> 지역시간
import time
now = 1598523184
local_tuple = time.localtime(now)
time_format = '%y-%m-%d %H:%M:%s'
time_str = time.strftime(time_format, local_tuple)
print(time_str)
time_tuple = time.strptime(time_str, time_format)
utc_now = time.mktime(time_tuple)
print(utc_now)
time 문제점
- 시간 변환이 복잡하다.
- 윈도우 플랫폼에서는 time이 제공하는 시간대 관련 기능 중 몇 가지 사용 불가
datetime
- datetime 사용하면 UTC나 지역 시간 등 여러 시간대에 속한 시간을 상호 변환 가능
- datetime 클래스는 날짜와 시간을 동시에 표현하기 위해 사용되며, date,time 클래스에서 지원하는 대부분의 기능을 지원함.
- datetime 클래스의 생성자는 연,월,일,시,분,초,마이크로 초,시간대를 인자로 받음.
- datetime 클래스의 combine() 메서드를 사용하면 기존에 생성해둔 date나 time 객체를 활용해서 datetime 객체 생성 가능
- 현재 시각 얻고 싶다면 datetime.now() 메서드 사용
- datetime.strptime() 메서드는 다양한 포멧의 문자열을 datetime 객체로 변환함
- strftime() 메서드와 달리 strptime() 메서드는 datetime 클래스에서만 지원함.
- localize() : 시간대 보정이 없는, 순수한 datetime을 지역화하는데 사용.
추가
timedelta
- datetime 내장 모듈의 timedelta 클래스는 기간을 표현하기 위해서 사용됨.
- timedelta 클래스의 생성자는 주, 일, 시, 분, 초, 마이크로 초, 밀리 초를 인자로 받음.
- timedelta는 내부적으로 일, 초, 마이크로 초 단위만 저장함.
timezone
- datetime 내장 모듈의 timezone 클래스는 시간대를 표현하기 위해서 사용됨
- timezone 클래스의 생성자는 UTC 기준으로 시차를 표현하는 timedelta 객체를 인자로 받아 timezone 객체를 생성함.
유닉스 시간(Unix Time)
- Epoch Time, POSIX Time 이라고 부르는 시간 표기법은 "1970-01-01 T 00:00:00 UTC"를 기준으로 몇 초가 흘렀는지를 표기하는 방식.
- 초단위로 표시되는 일종의 세계 표준시
- 예를 들어, 2019-01-01 UTC+9, 2018-12-31 UT의 유닉스 시간은 1546268400으로 동일함. 같은 시간대
- 초 단위를 기본으로 하기 때문에 보통 integer, 파이썬은 float을 사용해서 마이크로초까지 표시됨.
- 참고로 유닉스 시간은 2038년에 Integer 범위를 벗어남.
datetime.replace() vs datetime.astimezone()
- replace는 tzinfo를 단순히 덮어쓰는 명령어, astimezone은 표준 시간대를 변경하면 지역시가 어떻게 바뀌는지 계산해줌.
- replace는 각 시간대별 시차를 계산할 때 사용할 수 있고, astimezone은 다른 나라의 지역시를 계산할 때 사용 가능.
loaclize -> normalize 순서 준수
- timezone이 세팅된 후에 처리되므로 반드시 localize 한 후에 처리할 것
- localize()는 모든 경우를 다루지 못한다. 예로, 국가가 시간대 정의를 변경하는 경우, 일광절약시간 종료일 같은 문제들 해결 X
요약
- 여러 다른 시간대를 변환할 때는 time 모듈을 쓰지 말라
- 여러 다른 시간대를 신뢰할 수 있게 변환하고 싶으면 datetime, pytz 모듈을 함께 사용하라
- 항상 시간을 UTC로 표시하고, 최종적으로 표현하기 직전에 지역 시간으로 변환하라.