2009-04-16 17 views

Répondre

110

d = DateTime.now.utc

Oops!

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

d = Time.now.utc 

Est-ce que fonctionne cependant. Pour quelle raison devez-vous 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 
+0

Parce que je veux la bonne date pour la conversion, à savoir, pour GMT + 10 peut être avant le lendemain ... – Ash

+2

le temps fera que pour vous bien. Le temps inclut également la partie date, pas seulement le moment de la journée. Faites du Time.now.inspectez-vous pour jeter un coup d'œil. – DanSingerman

+2

Oh doux. Alors, quelle est la différence entre Date, Heure et DateTime alors? – Ash

1

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 de la utc. Mais comme posté si c'est juste le temps que vous pouvez utiliser:

Time.now.utc 

et l'obtenir tout de suite.

148
DateTime.now.new_offset(0) 

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

+1

Et c'est en fait la réponse la plus correcte à la question. – Ernest

+1

Cela devrait avoir plus de votes upvotes. DateTime est différent de Time. J'avais exactement besoin de ça. – d11wtq

+0

@Ash, Il est en effet la bonne réponse – Abhinay

7

Malheureusement, la classe DateTime ne dispose pas des méthodes pratiques disponibles dans la classe Time pour cela. Vous pouvez convertir tout objet DateTime en UTC comme ceci:

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

Vous pouvez passer de l'UTC à l'heure locale à l'aide:

d.new_offset(DateTime.now.offset) 

d est un objet DateTime dans le temps UTC. Si vous souhaitez ceux-ci comme des 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 lors de 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 en heure du Pacifique avec un décalage de -07: 00. Appeler localtime comme décrit précédemment convertit correctement l'objet DateTime en heure locale. L'appel au utc sur l'objet le convertit correctement en décalage UTC.

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 
2

Vous pouvez définir une ENV si vous voulez que votre Time.now et DateTime.now pour répondre dans le 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" 
1

Essayez ceci, travaille à Ruby:

DateTime.now.to_time.utc 
Questions connexes