Respuestas:
d = DateTime.now.utc
¡Ups!
Eso parece funcionar en Rails, pero no vainilla Ruby (y por supuesto eso es lo que hace la pregunta)
d = Time.now.utc
Sin embargo, funciona.
¿Hay alguna razón por la que debas usar DateTimey no Time? Timedebe incluir todo lo que necesita:
irb(main):016:0> Time.now
=> Thu Apr 16 12:40:44 +0100 2009
DateTime.now.new_offset(0)
funcionará en Ruby estándar (es decir, sin ActiveSupport).
new_offsetEl argumento del método 0ya es predeterminado . Así que también DateTime.now.new_offsetse puede utilizar.
Desafortunadamente, la clase DateTime no tiene los métodos de conveniencia disponibles en la clase Time para hacer esto. Puede convertir cualquier objeto DateTime en UTC como este:
d = DateTime.now
d.new_offset(Rational(0, 24))
Puede volver de UTC a la hora local usando:
d.new_offset(DateTime.now.offset)
donde des un objeto DateTime en hora UTC. Si desea que estos sean métodos de conveniencia, puede crearlos así:
class DateTime
def localtime
new_offset(DateTime.now.offset)
end
def utc
new_offset(Rational(0, 24))
end
end
Puede ver esto en acción en la siguiente sesión 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 puede ver arriba, el objeto DateTime inicial tiene un desplazamiento de -04: 00 (hora del este). Estoy en la hora del Pacífico con un desplazamiento de -07: 00. Llamar localtimecomo se describió anteriormente convierte correctamente el objeto DateTime en la hora local. Llamar utcal objeto lo convierte correctamente en un desplazamiento UTC.
Puede configurar un ENV si desea que su Time.nowy DateTime.nowresponda en hora 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"