##時間を変更する意味
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メソッドを使おう