time_formats.rbを使って日付を整形しjsonに変換する(rails)
time_formats.rbを使って日付を整形しjsonに変換する方法(rails)
大まかな流れは以下のようになる。
以下それぞれの詳細について書いていく。
time_formatsの設定
config/initializers配下にtime_formats.rbファイルを作成。
time_formats.rbには以下のようにかく。
Time::DATE_FORMATS[:default] = '%Y/%m/%d %H:%M'
Time::DATE_FORMATS[:datetime] = '%Y/%m/%d %H:%M'
Time::DATE_FORMATS[:date] = '%Y/%m/%d'
Time::DATE_FORMATS[:time] = '%H:%M:%S'
Date::DATE_FORMATS[:default] = '%Y/%m/%d'
こうすることで、
もともと以下のような日付を表示するデフォルトのフォーマットだったものが、
irb(main):001:0> Time.now.to_s
=> 2018-10-11 00:36:37 +0900
以下のようになる。
irb(main):002:0> Time.now.to_s
=> "2018/10/11 00:36"
jbuilderの設定
json.jbuilderファイルにおいて、message というインスタンスの created_at のフォーマットをjson形式に変換するには以下のようにかく。
rubyオブジェクト.to_s、のように書く。
json.time message.created_at.to_s
jsファイルでjson形式で取得したデータを使用
$(function() {
function buildHTML(message){var html = `<div class="upper-message__date">
${ message.time }
</div>`;return html;
}
....
上記のように、json形式で受け取ったデータをjQueryオブジェクトとして使うと、
"2018/10/11 00:36" のように日付が整形されて表示される。
strftimeよりなぜtime_formatsを使うか
time_formatsを使用しなくとも、以下のようにjson.jbuilderファイルでstrftimeを使用すれば、日付の整形をすることができる。
message.created_at.strftime("%Y%m%d")
=> "2018/10/11 00:36"
ただ、この場合だと、日付を表示させる場所ごとに毎回 strftime("%Y%m%d") と書かなくてはならないため、面倒だし修正も大変になってしまう。
そのため、config/initializer/time_formats.rb で指定してあげた方が良い。