Si j'ai d = DateTime.now
, comment puis-je convertir "d" en UTC (avec la date appropriée)?
Réponses
Trop de publicités? 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
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)
où 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.