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).