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 DateTimee non Time? Timedovrebbe 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_offsetil valore predefinito dell'argomento del metodo è 0già. Quindi DateTime.now.new_offsetpuò 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 localtimecome descritto in precedenza converte correttamente l'oggetto DateTime nell'ora locale. La chiamata utcsull'oggetto lo converte correttamente in un offset UTC.
È possibile impostare un ENV se si desidera che Time.nowe DateTime.nowrisponda 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"