Comment convertir DateTime.now en UTC dans Ruby?


98

Si c'est le cas d = DateTime.now, comment puis-je convertir «d» en UTC (avec la date appropriée)?

Réponses:


156

d = DateTime.now.utc

Oups!

Cela semble fonctionner dans Rails, mais pas dans Ruby vanille (et bien sûr, c'est ce que la question pose)

d = Time.now.utc

Fonctionne cependant.

Y a-t-il une raison pour laquelle vous devez utiliser DateTimeet non Time? Timedevrait inclure tout ce dont vous avez besoin:

irb(main):016:0> Time.now
=> Thu Apr 16 12:40:44 +0100 2009

Parce que je veux la date correcte pour la conversion, c'est à dire, pour GMT +10 peut être en avance le lendemain ...
Ash

2
Le temps le fera très bien pour vous. L'heure comprend également la partie date, pas seulement l'heure de la journée. Faites Time.now.inspect pour jeter un coup d'œil.
DanSingerman

2
Oh doux. Alors, quelle est la différence entre Date, Heure et DateHeure?
Ash

18
L'heure est stockée en interne sous forme de nombre de secondes et de microsecondes depuis l'époque, le 1er janvier 1970 00:00 UTC. La date, en interne, est représentée comme un numéro de jour astronomique julien, et DateTime est tout simplement bizarre (c'est probablement pourquoi Rails le remplace)
DanSingerman

169
DateTime.now.new_offset(0)

fonctionnera en Ruby standard (c'est-à-dire sans ActiveSupport).


3
Et c'est en fait la réponse la plus correcte à la question.
Ernest

2
Cela devrait avoir plus de votes positifs. DateTime est différent de Time. J'avais besoin exactement de ça.
d11wtq

1
new_offsetL'argument de méthode par défaut est 0déjà. Donc DateTime.now.new_offsetpeut être utilisé aussi.
Cryptor

8

Malheureusement, la classe DateTime ne dispose pas des méthodes pratiques disponibles dans la classe Time pour ce faire. Vous pouvez convertir n'importe quel objet DateTime en UTC comme ceci:

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

Vous pouvez revenir de l'heure UTC à l'heure locale en utilisant:

d.new_offset(DateTime.now.offset)

dest un objet DateTime en heure UTC. Si vous les souhaitez comme méthodes pratiques, vous pouvez les créer comme ceci:

class DateTime
  def localtime
    new_offset(DateTime.now.offset)
  end

  def utc
    new_offset(Rational(0, 24))
  end
end

Vous pouvez voir cela en action dans la session irb suivante:

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" 

Comme vous pouvez le voir ci-dessus, l'objet DateTime initial a un décalage de -04: 00 (heure de l'Est). Je suis à l'heure du Pacifique avec un décalage de -07: 00. L'appel localtimecomme décrit précédemment convertit correctement l'objet DateTime en heure locale. L'appel utcde l'objet le convertit correctement en un décalage UTC.


5

Essayez ceci, fonctionne en Ruby :

DateTime.now.to_time.utc

4

Vous pouvez définir une ENV si vous voulez que votre Time.nowet DateTime.nowréponde en heure 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"

2

En 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"

convertira l'heure en utc. Mais comme indiqué si c'est juste le temps, vous pouvez utiliser:

Time.now.utc

et obtenez-le tout de suite.


1

La représentation sous forme de chaîne d'un DateTime peut être analysée par la classe Time.

> Time.parse(DateTime.now.to_s).utc
=> 2015-10-06 14:53:51 UTC
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.