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 DateTime
y no Time
? Time
debe 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_offset
El argumento del método 0
ya es predeterminado . Así que también DateTime.now.new_offset
se 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 d
es 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 localtime
como se describió anteriormente convierte correctamente el objeto DateTime en la hora local. Llamar utc
al objeto lo convierte correctamente en un desplazamiento UTC.
Puede configurar un ENV si desea que su Time.now
y DateTime.now
responda 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"