Antworten:
d = DateTime.now.utc
Hoppla!
Das scheint in Rails zu funktionieren, aber nicht in Vanilla Ruby (und das ist natürlich die Frage)
d = Time.now.utc
Funktioniert jedoch.
Gibt es einen Grund, den Sie verwenden müssen DateTime
und nicht Time
? Time
sollte alles enthalten, was Sie brauchen:
irb(main):016:0> Time.now
=> Thu Apr 16 12:40:44 +0100 2009
DateTime.now.new_offset(0)
funktioniert in Standard-Ruby (dh ohne ActiveSupport).
new_offset
Das Standardargument ist 0
bereits. So DateTime.now.new_offset
können auch verwendet werden.
Leider verfügt die DateTime-Klasse nicht über die in der Time-Klasse verfügbaren praktischen Methoden, um dies zu tun. Sie können jedes DateTime-Objekt folgendermaßen in UTC konvertieren:
d = DateTime.now
d.new_offset(Rational(0, 24))
Sie können von UTC zu Ortszeit zurückkehren, indem Sie:
d.new_offset(DateTime.now.offset)
Wo d
ist ein DateTime-Objekt in UTC-Zeit? Wenn Sie diese als praktische Methoden möchten, können Sie sie folgendermaßen erstellen:
class DateTime
def localtime
new_offset(DateTime.now.offset)
end
def utc
new_offset(Rational(0, 24))
end
end
Sie können dies in der folgenden irb-Sitzung in Aktion sehen:
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"
Wie Sie oben sehen können, hat das ursprüngliche DateTime-Objekt einen Offset von -04: 00 (Eastern Time). Ich bin in der pazifischen Zeit mit einem Offset von -07: 00. localtime
Wenn Sie wie zuvor beschrieben aufrufen, wird das DateTime-Objekt ordnungsgemäß in die Ortszeit konvertiert. Wenn Sie utc
das Objekt ordnungsgemäß aufrufen, wird es in einen UTC-Offset konvertiert.
Sie können eine ENV einstellen, wenn Sie möchten Time.now
und DateTime.now
in UTC-Zeit antworten möchten .
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"