Rails で時間・時刻表示の独自フォーマットを作成する

Rails の ActiveSupport には超便利なメソッドがたくさん用意されています。時間の操作のためにも便利なメソッドがたくさんありますが、今回は時刻を表示する独自のフォーマットを作成する方法です。

スポンサーリンク

— 環境 —
Rails 4.0.1

Time::DATE_FORMATS ハッシュに追加する

Time::DATE_FORMATS というハッシュに時刻出力用のフォーマットが定義されています。デフォルトで定義されているフォーマット以外にも、このハッシュにオリジナルなフォーマットを追加することができる。フォーマットを追加し、config/initializers で読み込まれるようにします。

config/initializers/00_load_config.rb

秒なしと年月日のみのフォーマットを追加しました。公式の rails API ガイドでは、config/initializers/time_formats.rb を作成するように説明してありました。末尾リンク参照。私は、独自定数の定義ファイル(00_load_config.rb)を既に作成済みだったので、それに書いた。

そして、追加したフォーマットのキーを to_formatted_s メソッドに引数で渡します。以下はビューで、@post が作成された日時(created_at)を、独自に定義した :without_second のフォーマット(秒なしフォーマット)で出力する例です。

このように、年月日時分が出力されます(秒は出力されない)。Rails デフォルトの UTC 時刻で出力されています。

ユーザーがタイムゾーンを持つ場合 in_time_zone して to_formatted_s

I18n を使って国際化してユーザーごとにタイムゾーンを持っている場合は、データベースには時刻を UTC で統一して created_at, updated_at などのカラムに保存しておきます。Rails はデフォルトでは DB への時間保存は UTC になるようです。

そして、出力の際に以下のように in_time_zone メソッドを使います。User モデルの time_zone 属性にユーザーのタイムゾーンが保存されているものとする。

この例での @user.time_zone は Tokyo です。先ほどの UTC による出力(2014-03-31 12:23)から、ちゃんとプラス9時間になっています。

ちなみにデフォルトで用意されている :db オプションですと、in_time_zone した後にフォーマットしても何故か UTC 時間で出力されるので注意。

@user.time_zone が Tokyo であっても、何故か UTC 時刻が出力されるので駄目でした。最初の例のように、独自に定義したフォーマットを使うとOKです。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!