2009-04-16 9 views

risposta

110

d = DateTime.now.utc

Oops!

che sembra funzionare in Rails, ma non vaniglia di Ruby (e, naturalmente, questo è ciò che la questione sta chiedendo)

d = Time.now.utc 

funziona comunque.

C'è qualche motivo per cui è necessario utilizzare DateTime e non Time? Time dovrebbe includere tutto ciò che serve:

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

Perché voglio la data corretta per la conversione, vale a dire, per GMT +10 possono essere davanti il ​​giorno dopo ... – Ash

+2

tempo lo farà per te bene. Il tempo include anche la parte della data, non solo l'ora del giorno. Time.now.inspect per dare un'occhiata. – DanSingerman

+2

Oh dolce. Allora, qual è la differenza tra Data, Ora e Data e ora? – Ash

1

In 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" 

convertirà il tempo per l'UTC. Ma come pubblicato se è solo tempo è possibile utilizzare:

Time.now.utc 

e farlo subito.

148
DateTime.now.new_offset(0) 

funzionerà in Ruby standard (ovvero senza ActiveSupport).

+1

E questa è in realtà la risposta più corretta alla domanda. – Ernest

+1

Questo dovrebbe avere più upvotes. DateTime è diverso dal tempo. Mi serviva esattamente questo. – d11wtq

+0

@Ash, è davvero la risposta giusta – Abhinay

7

Sfortunatamente, la classe DateTime non ha i metodi di convenienza disponibili nella classe Time per farlo. È possibile convertire qualsiasi oggetto DateTime in UTC in questo modo:

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

È possibile tornare da UTC a localtime usando:

d.new_offset(DateTime.now.offset) 

dove d è un oggetto DateTime nel tempo UTC. Se vuoi questi come metodi di convenienza, quindi è possibile crearli in questo modo:

class DateTime 
    def localtime 
    new_offset(DateTime.now.offset) 
    end 

    def utc 
    new_offset(Rational(0, 24)) 
    end 
end 

si può vedere questo in azione nella sessione seguente IRB:

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" 

Come potete vedere sopra, l'oggetto DateTime iniziale ha un offset -04: 00 (Eastern Time). Sono in Pacific Time con un offset di -07: 00. Chiamando localtime come descritto in precedenza, converte correttamente l'oggetto DateTime in ora locale. Chiamando utc sull'oggetto lo converte correttamente in un offset UTC.

1

La rappresentazione di stringa di un DateTime può essere analizzata dalla classe Time.

> Time.parse(DateTime.now.to_s).utc 
=> 2015-10-06 14:53:51 UTC 
2

è possibile impostare un'ENV se volete che il vostro Time.now e DateTime.now di rispondere in tempo 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

Prova questo, funziona in Ruby:

DateTime.now.to_time.utc