19
17

More than 1 year has passed since last update.

【Rails】タイムゾーンを日本時間に変更する

Posted at

時間を変更する意味

RailsのデフォルトタイムゾーンはUTC(協定時)となっているため、created_atメソッドupdated_atメソッドを使って時間を表示させてみると日本時間から9時間差の表記になってしまう。この差分を埋めるため、時間設定をする必要がある。

手順

config/application.rbファイルにconfig.time_zone = 'Tokyo'を記載。

class Application < Rails::Application
  config.time_zone = 'Tokyo'
end

上記の設定が完了したら、一度アプリケーションを落とし再起動すると日本時間での表記になる。

ただし、このままだと表記されると
Tue, 30 Jul 2019 00:12:19 +0000のようになり、少し見にくくなってしまう。

読みやすい日時フォーマットにする

※ネットで検索すると以下のようにstrftimeメソッドを使って検索する方法がよく出てくるが、他にも日時を表示するViewがあると、
'%Y/%m/%d %H:%M:%S'のような書式文字列を繰り返し書かないといけないため、コードがDRYにならない。DRYでないコードは変更に弱いコードため、あまりおすすめできない

<%= user.created_at.strftime('%Y/%m/%d %H:%M:%S') %>

<おすすめ方法>lメソッドでDRYに書式を指定する
手順
①日本語化設定
②フォーマット作成
③viewに記入

①日本語化設定
config/application.rbファイルにconfig.i18n.default_locale = :jaを追加。

class Application < Rails::Application
    config.i18n.default_locale = :ja
  end

②フォーマット作成
config/locales/ja.ymlというファイルを作成し、以下のような設定を記述。

ja:
  time:
    formats:
      default: "%Y/%m/%d %H:%M:%S"

③viewに記入
lメソッドを使って書式を指定する。

<%= l user.created_at %>

例:
変更前  30 Jul 2019 00:12:19 +0000
変更後  2019/07/30 12:19

短く表記したい場合は、formatオプションを付けると、書式を切り替えることができる。

<%= l user.created_at, format: :short %>

例:
変更前  30 Jul 00:12:19 +0000
変更後  07/30 12:19

:shortを指定したので、ja.ymlに対応する書式を設定。

ja:
  time:
    formats:
      default: "%Y/%m/%d %H:%M:%S"
      short: "%m/%d %H:%M"

注意: View以外ではI18n.lを使う
Viewではlと書くだけ良いが、lメソッドがヘルパーメソッドとして提供されていない場所(Modelなど)では、lだけではNoMethodErrorになる。
その場合は、lの代わりにI18n.lと書けば、日時をフォーマットすることができる。

ちなみにlはlocalizeのエイリアスメソッドなので、localizeと書いても大丈夫。

以下の記述はどれも同じ結果になる。

= l user.created_at
= I18n.l user.created_at
= localize user.created_at
= I18n.localize user.created_at

参考記事

Railsのタイムゾーンを日本時間にする
【初心者向け・動画付き】Railsで日時をフォーマットするときはstrftimeよりも、lメソッドを使おう

19
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
17