LYnLab

소개블로그취미로그

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

2017-05-02#프로그래밍

💡 이 글은 작성된지 1년 이상 지났습니다. 정보글의 경우 최신 내용이 아닐 수 있음에 유의해주세요.

타임존을 설정하자

타임존을 관리하는 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로 표시됩니다.

관련된 글

Rails와 GitHub Actions에 커버리지 레포트를 달아보자

이 블로그의 CMS이기도 한 Shiori를 대폭 리팩토링하면서 테스트가 얼마나 잘 작성되어있는지 궁금해졌습니다.

Rails Global ID로 전역 객체 식별하기

Global ID는 Rails의 모든 객체를 식별할 수 있는 URI(Uniform Resource Identifier)입니다.

Ruby on WebAssembly: 살짝 맛보기

Ruby 3.2에 추가된 WebAssembly 지원을 간단하게 테스트해봅시다.

작성한 댓글은 giscus를 통해 GitHub Discussion에 저장됩니다.

크리에이티브 커먼즈 라이선스크리에이티브 커먼즈 저작자표시크리에이티브 커먼즈 동일조건변경허락

본 사이트의 저작물은 별도의 언급이 없는 한 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

© 2011 - 2024 Hoerin Doh, All rights reserved.

LYnLab 로고About MeGitHubTwitterInstagram