Frage Wie konvertiere ich DateTime.now nach UTC in Ruby?


Wenn ich habe d = DateTime.now, wie konvertiere ich 'd' in UTC (mit dem entsprechenden Datum)?


75
2018-04-16 11:15


Ursprung


Antworten:


d = DateTime.now.utc

Hoppla!

Das scheint in Rails zu funktionieren, aber nicht in Vanilla Ruby (und natürlich fragt die Frage danach)

d = Time.now.utc

Funktioniert aber.

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

119
2018-04-16 11:17



DateTime.now.new_offset(0)

funktioniert in Standard-Ruby (d. h. ohne ActiveSupport).


157
2018-05-15 00:14



Leider verfügt die DateTime-Klasse nicht über die in der Time-Klasse verfügbaren Komfortmethoden. Sie können ein beliebiges DateTime-Objekt wie folgt in UTC konvertieren:

d = DateTime.now
d.new_offset(Rational(0, 24))

Sie können von UTC auf localtime umschalten mit:

d.new_offset(DateTime.now.offset)

woher d ist ein DateTime-Objekt in UTC-Zeit. Wenn Sie diese als Convenience-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 Pacific Time mit einem Offset von -07: 00. Berufung localtime Wie zuvor beschrieben konvertiert das DateTime-Objekt korrekt in lokale Zeit. Berufung utc auf dem Objekt konvertiert es richtig in einen UTC-Offset.


8
2017-08-03 20:02



Sie können ein ENV einstellen, wenn Sie möchten Time.now und DateTime.now um in UTC-Zeit zu antworten.

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"

3
2017-11-30 19:40



Versuchen Sie das, funktioniert in Ruby:

DateTime.now.to_time.utc

2
2017-11-11 02:02



In irb:

>>d = DateTime.now
=> #<DateTime: 11783702280454271/4800000000,5/12,2299161>
>> "#{d.hour.to_i - d.zone.to_i}:#{d.min}:#{d.sec}"
=> "11:16:41"

wandelt die Zeit in die Utc um. Aber wie gepostet, wenn es gerade Zeit ist, können Sie verwenden:

Time.now.utc

und hol es sofort.


1
2018-04-16 11:29



Die Zeichenfolgendarstellung einer DateTime kann von der Time-Klasse analysiert werden.

> Time.parse(DateTime.now.to_s).utc
=> 2015-10-06 14:53:51 UTC

0
2017-10-06 14:55