Comment puis-je convertir DateTime.now en UTC en Ruby?

Si j’ai d = DateTime.now , comment puis-je convertir ‘d’ en UTC (avec la date appropriée)?

d = DateTime.now.utc

Oops!

Cela semble fonctionner dans Rails, mais pas avec 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 DateTime et non Time ? Time devrait inclure tout ce dont vous avez besoin:

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

travaillera en standard Ruby (c.-à-d. sans ActiveSupport).

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

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

Vous pouvez revenir de UTC à heure locale en utilisant:

 d.new_offset(DateTime.now.offset) 

d est un object DateTime à l’heure UTC. Si vous souhaitez que ces méthodes soient 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 le voir en action dans la session irb suivante:

 d = DateTime.now.new_offset(Rational(-4, 24)) => # 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’object DateTime initial a un décalage de -04: 00 (heure de l’Est). Je suis en heure du Pacifique avec un décalage de -07: 00. L’appel de localtime comme décrit précédemment convertit correctement l’object DateTime en heure locale. Appeler utc sur l’object le convertit correctement en un décalage UTC.

Vous pouvez définir une ENV si vous voulez que votre Time.now et DateTime.now répondent Time.now en temps 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" 

Essayez ceci, fonctionne en Ruby:

 DateTime.now.to_time.utc 

En irb:

 >>d = DateTime.now => # >> "#{d.hour.to_i - d.zone.to_i}:#{d.min}:#{d.sec}" => "11:16:41" 

convertira l’heure en utc. Mais comme posté si c’est juste le temps que vous pouvez utiliser:

 Time.now.utc 

et obtenez tout de suite.

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