タイムゾーンを/config/application.rb
に設定しており、アプリで生成されるすべての時間はデフォルトでこのタイムゾーンになると予想していますが、新しいDateTime
オブジェクトを作成するとき(.new
)、GMT
に作成します。アプリのタイムゾーンに合わせるにはどうすればよいですか?
/ config/application.rb
config.time_zone = 'Pacific Time (US & Canada)'
irb
irb> DateTime.now
=> Wed, 11 Jul 2012 19:04:56 -0700
irb> mydate = DateTime.new(2012, 07, 11, 20, 10, 0)
=> Wed, 11 Jul 2012 20:10:00 +0000 # GMT, but I want PDT
in_time_zone
を使用しても機能しません。これは、GMT時間をPDT時間に変換するだけで、これが間違った時間であるためです。
irb> mydate.in_time_zone('Pacific Time (US & Canada)')
=> Wed, 11 Jul 2012 13:10:00 PDT -07:00 # wrong time (I want 20:10)
ActiveSupportの TimeWithZone (Time.zone
)アプリケーションのタイムゾーンで日付を作成および解析するオブジェクト:
1.9.3p0 :001 > Time.zone.now
=> Wed, 11 Jul 2012 19:47:03 PDT -07:00
1.9.3p0 :002 > Time.zone.parse('2012-07-11 21:00')
=> Wed, 11 Jul 2012 21:00:00 PDT -07:00
文字列を解析しない別の方法:
irb> Time.zone.local(2012, 7, 11, 21)
=> Wed, 07 Nov 2012 21:00:00 PDT -07:00
持っている場合、通常はTime.newまたはDateTime.newをインスタンス化するときにutc_offsetを指定するだけです。
[1] pry(main)> Time.new(2013,01,06, 11, 25, 00) #no specified utc_offset defaults to system time
=> 2013-01-06 11:25:00 -0500
[2] pry(main)> Time.new(2013,01,06, 11, 25, 00, "+00:00") #UTC
=> 2013-01-06 11:25:00 +0000
[3] pry(main)> Time.new(2013,01,06, 11, 25, 00, "-08:00") #PST
=> 2013-01-06 11:25:00 -0800
これは、DateTimeクラスでもタイムゾーンを含めることで実現できます。
2.5.1 :001 > require 'Rails'
=> true
2.5.1 :002 > mydate = DateTime.new(2012, 07, 11, 20, 10, 0)
=> Wed, 11 Jul 2012 20:10:00 +0000
2.5.1 :003 > mydate = DateTime.new(2012, 07, 11, 20, 10, 0, "PST")
=> Wed, 11 Jul 2012 20:10:00 -0800
または
https://docs.Ruby-lang.org/en/2.6.0/DateTime.html
2.6.0 :001 > DateTime.new(2012, 07, 11, 20, 10, 0, "-06")
=> Wed, 11 Jul 2012 20:10:00 -0600
2.6.0 :002 > DateTime.new(2012, 07, 11, 20, 10, 0, "-05")
=> Wed, 11 Jul 2012 20:10:00 -0500
ApplicationControllerで次の手順を実行して、タイムゾーンをユーザーの時間に設定します。
これがあなたが望むものかどうかはわかりません。
class ApplicationController < ActionController::Base
before_filter :set_timezone
def set_timezone
# current_user.time_zone #=> 'London'
Time.zone = current_user.time_zone if current_user && current_user.time_zone
end
end