Ruby on Rails 타임존을 설정하는 두 가지 변수

설명이 없습니다

2017. 05. 02.

타임존을 설정하자

타임존을 관리하는 config 변수는 아래와 같이 두 가지입니다.

config.time_zone = 'Seoul'  
config.active_record.default_timezone = :local

config.active_record.default_timezone

이름 그대로 ActiveRecord에서 사용하는 타임존입니다. 기본값은 ':utc' 입니다.

MySQL등의 데이터베이스는 DATETIME 자료형에 시간대 정보가 포함되어있지 않습니다. 즉 DB에 저장되어있는 2017-05-02 13:15:00라는 값이 UTC 기준인지, 로컬 기준인지 알 방법이 없습니다. 때문에 ORM의 자의적인 시간대 해석이 들어가야하는데, ActiveRecord는 위와 같은 방식으로 설정할 수 있습니다.

가급적이면 기본 설정(:utc)을 그대로 따라가는 쪽이 편리합니다. DB에는 utc로 저장해놓되, 사용할 때 자신의 타임존(:local)으로 변경하는 것이 유리하죠.

하지만 저의 경우 JPA를 주력으로 사용하고 있는데, LocalDateTime 변수를 사용하다보니 DB의 모든 Date, Datetime이 이미 KST로 저장되어있어 불가피하게 ActiveRecord 측 타임존을 변경해주어야 했습니다.

config.time_zone

Rails 상에서 사용될 타임존입니다. 기본값은 마찬가지로 'utc' 이며, 특정 값을 설정 시 해당 타임존의 로케일을 따르게 됩니다.

예를 들어, config.time_zone='Seoul' 로 설정하면 ko.time.format 로케일 표기 방법으로 시간이 표시됩니다.

예제

MySQL DB에 2017-05-02 13:15:00 이라는 값이 들어있다고 가정합시다.

config.time_zone = 'Seoul'  
config.active_record.default_timezone = :local

위는 DB의 시간대가 KST이고, KST로 표시해야됨을 의미합니다. 즉, 저장된 그대로 표시하면 됩니다. 따라서 Rails 에서는 2017년 05월 02일 13시 15분 00초 KST 로 표시됩니다.

config.time_zone = 'Seoul'  
config.active_record.default_timezone = :utc

이와 같은 경우에는 DB의 시간대가 utc이며, 표시는 KST로 해야됨을 의미합니다. 따라서 Rails에서는 +9시간의 시차를 더해준 2017년 05월 02일 22시 15분 00초 KST로 표시됩니다.

크리에이티브 커먼즈 라이선스

이 저작물은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

© 2011 - 2020 Do Hoerin, LYnLab