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


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


75
2018-04-16 11:15


origen


Respuestas:


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 necesites 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

119
2018-04-16 11:17



DateTime.now.new_offset(0)

funcionará en Ruby estándar (es decir, sin ActiveSupport).


157
2018-05-15 00:14



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)

dónde 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. Vocación localtime como se describió anteriormente, convierte adecuadamente el objeto DateTime a la hora local. Vocación utc en el objeto lo convierte adecuadamente en un desplazamiento UTC.


8
2017-08-03 20:02



Puede establecer un ENV si quiere su Time.now y DateTime.now para responder 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"

3
2017-11-30 19:40



Prueba esto, funciona en Ruby:

DateTime.now.to_time.utc

2
2017-11-11 02:02



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


1
2018-04-16 11:29



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

0
2017-10-06 14:55