[파이썬 코딩의 기술] - 67. 지역 시간에는 time 보다는 datetime을 사용하라

Dreamer ·2021년 7월 7일
0
  • 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

    요약

  1. 여러 다른 시간대를 변환할 때는 time 모듈을 쓰지 말라
  2. 여러 다른 시간대를 신뢰할 수 있게 변환하고 싶으면 datetime, pytz 모듈을 함께 사용하라
  3. 항상 시간을 UTC로 표시하고, 최종적으로 표현하기 직전에 지역 시간으로 변환하라.
profile
To be a changer who can overturn world

0개의 댓글