具体的には、Ruby標準ライブラリのDateTimeを使うか、ActiveSupport::TimeWithZoneを使うか。
以下、config/application.rb
にconfig.time_zone = 'Tokyo'
を設定してrails console
で実行
Datetime
[1] pry(main)> DateTime.parse('2015-10-01 00:00:00')
=> Thu, 01 Oct 2015 00:00:00 +0000
[2] pry(main)> DateTime.parse('2015-10-01 00:00:00').to_s
=> "2015-10-01T00:00:00+00:00"
ActiveSupport::TimeWithZone
[1] pry(main)> Time.zone.parse('2015-10-01 00:00:00')
=> Thu, 01 Oct 2015 00:00:00 JST +09:00
[2] pry(main)> Time.zone.parse('2015-10-01 00:00:00').to_s
=> "2015-10-01 00:00:00 +0900"
と言う結果で、DateTimeではRailsアプリに設定したタイムゾーンを無視してUTCで扱われ、ActiveSupport::TimeWithZoneでは設定したタイムゾーンが有効になる。
また、文字列を出力した場合の結果も多少違っている。
パースするだけなら利便性はActiveSupport::TimeWithZoneに軍配が上がるか。
なお、Ruby標準のTimeでは文字列からのパースは出来ない? 模様。
追記
コメントで
RailsであればStringのオブジェクトから直接コンバートすることもできます。
との情報をいただいた。
[1] pry(main)> '2015-10-01 00:00:00'.in_time_zone
=> Thu, 01 Oct 2015 00:00:00 JST +09:00
[2] pry(main)> '2015-10-01 00:00:00'.to_time
=> 2015-10-01 00:00:00 +0900
[3] pry(main)> '2015-10-01 00:00:00'.to_datetime
=> Thu, 01 Oct 2015 00:00:00 +0000
それぞれActiveSupport::TimeWithZone、Time、DateTimeのインスタンスが返ってくる。Rails内ではActiveSupport::TimeWithZoneが一番使い勝手がいいようなので、特に理由がなければ'2015-10-01 00:00:00'.in_time_zone
を使うのがよさそう。Rubyの書式としてもわかりやすい気がする。
@jnchitoさんありがとうございました。