Risposte:
d = DateTime.now.utc
Ops!
Sembra funzionare in Rails, ma non vanilla Ruby (e ovviamente questo è ciò che si pone la domanda)
d = Time.now.utc
Funziona comunque.
C'è qualche motivo per cui devi usare DateTime
e non Time
? Time
dovrebbe includere tutto ciò di cui hai bisogno:
irb(main):016:0> Time.now
=> Thu Apr 16 12:40:44 +0100 2009
DateTime.now.new_offset(0)
funzionerà in Ruby standard (cioè senza ActiveSupport).
new_offset
il valore predefinito dell'argomento del metodo è 0
già. Quindi DateTime.now.new_offset
può essere utilizzato anche.
Sfortunatamente, la classe DateTime non dispone dei metodi convenienti disponibili nella classe Time per eseguire questa operazione. Puoi convertire qualsiasi oggetto DateTime in UTC in questo modo:
d = DateTime.now
d.new_offset(Rational(0, 24))
Puoi tornare da UTC a ora locale utilizzando:
d.new_offset(DateTime.now.offset)
dove d
è un oggetto DateTime nell'ora UTC. Se desideri questi metodi di convenienza, puoi crearli in questo modo:
class DateTime
def localtime
new_offset(DateTime.now.offset)
end
def utc
new_offset(Rational(0, 24))
end
end
Puoi vederlo in azione nella seguente sessione 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 puoi vedere sopra, l'oggetto DateTime iniziale ha un offset di -04: 00 (Eastern Time). Sono nel fuso orario del Pacifico con un offset di -07: 00. La chiamata localtime
come descritto in precedenza converte correttamente l'oggetto DateTime nell'ora locale. La chiamata utc
sull'oggetto lo converte correttamente in un offset UTC.
È possibile impostare un ENV se si desidera che Time.now
e DateTime.now
risponda nell'ora 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"