回答:
d = DateTime.now.utc
おっとっと!
それはRailsでは機能しているようですが、Ruby Rubyでは機能しません(そしてもちろんそれが問題です)
d = Time.now.utc
しかし動作します。
あなたが使用する必要が何らかの理由があるDateTime
とないではTime
?Time
必要なものがすべて含まれている必要があります。
irb(main):016:0> Time.now
=> Thu Apr 16 12:40:44 +0100 2009
DateTime.now.new_offset(0)
標準のRuby(つまりActiveSupportなし)で動作します。
new_offset
メソッドの引数のデフォルトは0
すでにです。したがってDateTime.now.new_offset
、同様に使用できます。
残念ながら、DateTimeクラスには、Timeクラスでこれを行うための便利なメソッドがありません。次のように、任意のDateTimeオブジェクトをUTCに変換できます。
d = DateTime.now
d.new_offset(Rational(0, 24))
以下を使用して、UTCから現地時間に切り替えることができます。
d.new_offset(DateTime.now.offset)
どこd
DateTimeオブジェクトはUTC時刻です。これらを便利なメソッドとして使用したい場合は、次のように作成できます。
class DateTime
def localtime
new_offset(DateTime.now.offset)
end
def utc
new_offset(Rational(0, 24))
end
end
これは、次のirbセッションで実際に確認できます。
d = DateTime.now.new_offset(Rational(-4, 24))
=> #<DateTime: 106105391484260677/43200000000,-1/6,2299161>
1.8.7 :185 > d.to_s
=> "2012-08-03T15:42:48-04:00"
1.8.7 :186 > d.localtime.to_s
=> "2012-08-03T12:42:48-07:00"
1.8.7 :187 > d.utc.to_s
=> "2012-08-03T19:42:48+00:00"
上記のように、最初のDateTimeオブジェクトには-04:00オフセット(東部時間)があります。私は-07:00のオフセットで太平洋時間にいます。localtime
前述のように呼び出すと、DateTimeオブジェクトが現地時間に正しく変換されます。utc
オブジェクトを呼び出すと、適切にUTCオフセットに変換されます。
あなたがしたい場合は、ENVを設定することができますTime.now
し、DateTime.now
UTC時間で応答します。
require 'date'
Time.now #=> 2015-11-30 11:37:14 -0800
DateTime.now.to_s #=> "2015-11-30T11:37:25-08:00"
ENV['TZ'] = 'UTC'
Time.now #=> 2015-11-30 19:37:38 +0000
DateTime.now.to_s #=> "2015-11-30T19:37:36+00:00"