Respostas:
d = DateTime.now.utc
Ops!
Isso parece funcionar no Rails, mas não no Ruby vanilla (e é claro que é isso que a pergunta está perguntando)
d = Time.now.utc
Funciona no entanto.
Existe algum motivo que você precisa usar DateTime
e não Time
? Time
deve incluir tudo que você precisa:
irb(main):016:0> Time.now
=> Thu Apr 16 12:40:44 +0100 2009
DateTime.now.new_offset(0)
funcionará em Ruby padrão (ou seja, sem ActiveSupport).
new_offset
método padrão argumento para 0
já. Portanto, também DateTime.now.new_offset
pode ser usado.
Infelizmente, a classe DateTime não tem os métodos de conveniência disponíveis na classe Time para fazer isso. Você pode converter qualquer objeto DateTime em UTC assim:
d = DateTime.now
d.new_offset(Rational(0, 24))
Você pode voltar do UTC para o local usando:
d.new_offset(DateTime.now.offset)
onde d
é um objeto DateTime no horário UTC. Se você quiser esses métodos de conveniência, poderá criá-los assim:
class DateTime
def localtime
new_offset(DateTime.now.offset)
end
def utc
new_offset(Rational(0, 24))
end
end
Você pode ver isso em ação na seguinte sessão de 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"
Como você pode ver acima, o objeto DateTime inicial tem um deslocamento de -04: 00 (horário do leste). Estou no horário do Pacífico com uma diferença de -07: 00. Chamar localtime
conforme descrito anteriormente converte corretamente o objeto DateTime na hora local. Chamar utc
o objeto corretamente o converte em um deslocamento UTC.
Você pode definir um ENV se desejar Time.now
e DateTime.now
responder no horário 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"