타임존 이슈

datetime이 타임존과 엮여 표현되는 방식을 이해하고 헷갈리지 말자

db 타임존 설정은 보통 SYSTEM의 타임존 설정을 따르게 되어있음 SELECT @@global.time_zone; 

db가 돌고있는 시스템(보통 docker의 커널)의 타임존 설정은 대개 UTC +0000임. 때문에 DB의 타임존은 UTC를 따르는 것이 보통이고 표준이다.

db에 저장된 예시 데이터를 보면

한눈에 봐도 이른시간이 찍혀있고, UTC 기준임

datetime 데이터는 불변이라는 것을 잊으면 안된다. 데이터를 표현하는 방법이 타임존에 따라 여러가지 인 것이다.

DB가 UTC를 따르고, Django에서 TIME_ZONE = 'Asia/Seoul'; USE_TZ = True 로 지정한다면

  • datetime.now() -> 한국 기준 현재 시간
  • django에서 한국시간 타임존을 지정해 저장 -> db엔 utc로 저장
  • django에서 나이브 객체(타임존 지정x) 저장 -> USE_TZ(True)로 인해 한국시간으로 인식. db엔 utc로 저장
  • django 콘솔사용해 db에서 꺼낼땐 TIME_ZONE 이 UTC 인 time-zone-aware datetime 객체
  • django template 이용해서 렌더링 시에는 django의 TIME_ZONE 설정(‘Asia/Seoul’)에 따라 한국시간으로 표현됨
  • 문자열(2019-11-26) 사용해 django orm으로 쿼리할때 -> TIME_ZONE 설정(‘Asia/Seoul’)에 따라 KST datetime 객체로 바꾸어 쿼리해줌

DB가 UTC를 따르고, Django도 TIME_ZONE = 'UTC'; USE_TZ = True 라면

  • datetime.now() -> UTC 기준 현재 시간
  • django에서 한국시간 타임존을 지정해 저장 -> db엔 utc로 저장
  • django에서 나이브 객체(타임존 지정x) 저장 -> USE_TZ(True)로 인해 UTC로 인식. db에 utc로 저장
  • django 콘솔사용해 db에서 꺼낼땐 TIME_ZONE 이 UTC 인 time-zone-aware datetime 객체
  • django template 이용해서 렌더링 시에는 django의 TIME_ZONE 설정(‘UTC’)에 따라 UTC로 표현됨
  • 문자열(2019-11-26) 사용해 django orm으로 쿼리할때 -> TIME_ZONE 설정(‘UTC’)에 따라 UTC datetime 객체로 바꾸어 쿼리해줌

refs