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)

où 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.