rails now hours ruby

hours - ¿Cómo convierto DateTime.now a UTC en Ruby?



strftime ruby datetime (7)

Si tengo d = DateTime.now , ¿cómo convierto ''d'' en UTC (con la fecha apropiada)?


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 de esta manera:

d = DateTime.now d.new_offset(Rational(0, 24))

Puede volver atrás de UTC a localtime usando:

d.new_offset(DateTime.now.offset)

donde d es un objeto DateTime en hora UTC. Si desea estos 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

Puedes 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 una compensación de -04: 00 (hora del este). Estoy en Pacific Time con una compensación de -07: 00. Llamar a localtime como se describió anteriormente convierte adecuadamente el objeto DateTime en hora local. Llamar utc al objeto lo convierte adecuadamente en un desplazamiento UTC.


En irb:

>>d = DateTime.now => #<DateTime: 11783702280454271/4800000000,5/12,2299161> >> "#{d.hour.to_i - d.zone.to_i}:#{d.min}:#{d.sec}" => "11:16:41"

convertirá el tiempo al utc. Pero tal como se publicó, si es solo el tiempo, puede usar:

Time.now.utc

y obténgalo enseguida


La clase de tiempo puede analizar la representación de cadena de un DateTime.

> Time.parse(DateTime.now.to_s).utc => 2015-10-06 14:53:51 UTC


Prueba esto, funciona en Ruby:

DateTime.now.to_time.utc


Puede configurar un ENV si desea que su Time.now y DateTime.now respondan 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"


d = DateTime.now.utc

Oops!

Eso parece funcionar en Rails, pero no en Ruby (y por supuesto, eso es lo que pregunta)

d = Time.now.utc

Funciona sin embargo.

¿Hay alguna razón por la que necesite 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).