Si c'est le cas d = DateTime.now
, comment puis-je convertir «d» en UTC (avec la date appropriée)?
Réponses:
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 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)
fonctionnera en Ruby standard (c'est-à-dire sans ActiveSupport).
new_offset
L'argument de méthode par défaut est 0
déjà. Donc DateTime.now.new_offset
peut être utilisé aussi.
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ù d
est 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 localtime
comme décrit précédemment convertit correctement l'objet DateTime en heure locale. L'appel utc
de l'objet 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é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"
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.