94 votes

Comment 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)?

167voto

Greg Campbell Points 10321
 DateTime.now.new_offset(0)
 

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

146voto

DanSingerman Points 17301

d = DateTime.now.utc

Oops!

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

 d = Time.now.utc
 

Cela 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
 

8voto

Joel Watson Points 31

Malheureusement, la classe DateTime n'a pas la commodité des méthodes disponibles dans la classe Temps 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 y revenir à partir de l'UTC à localtime à l'aide de:

d.new_offset(DateTime.now.offset)

d est un objet DateTime en heure UTC. Si vous souhaitez que ces 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 le voir en action dans la suite de la cisr session:

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, le premier objet DateTime a un -04:00 décalage (Heure de l'est). Je suis dans le Pacifique avec un -07:00 décalage. Appelant localtime , comme indiqué précédemment, les convertit correctement l'objet DateTime en heure locale. Appelant utc sur l'objet correctement le convertit en un décalage UTC.

2voto

nitecoder Points 4561

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"
 

va convertir le temps à l'utc. Mais comme posté si c'est juste le temps, vous pouvez utiliser:

 Time.now.utc
 

et l'obtenir tout de suite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X