2009-04-16 17 views

Respuesta

110

d = DateTime.now.utc

Ups!

que parece funcionar en los carriles, pero no de vainilla Ruby (y, por supuesto, eso es lo que pide la 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 necesario:

irb(main):016:0> Time.now 
=> Thu Apr 16 12:40:44 +0100 2009 
+0

Porque quiero la fecha correcta para la conversión, es decir, para el GMT 10 puede estar a la cabeza al día siguiente ... – Ash

+2

tiempo hará que para ti bien El tiempo también incluye la parte de la fecha, no solo la hora del día. Haga Time.now.inspect para echar un vistazo. – DanSingerman

+2

Oh dulce. Entonces, ¿cuál es la diferencia entre Date, Time y DateTime? – Ash

1

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 momento de la UTC. Pero tal como se publicó en el momento, puede utilizar:

Time.now.utc 

y obtenerlo de inmediato.

148
DateTime.now.new_offset(0) 

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

+1

Y esta es en realidad la respuesta más correcta a la pregunta. – Ernest

+1

Esto debería tener más votos ascendentes. DateTime es diferente a Time. Necesitaba exactamente esto. – d11wtq

+0

@Ash, de hecho es la respuesta correcta – Abhinay

7

Desafortunadamente, la clase DateTime no tiene los métodos de conveniencia disponibles en la clase de tiempo para hacer esto. Puede convertir cualquier objeto DateTime en UTC así:

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

Puede volver a la 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 métodos de conveniencia, a continuación, los puede crear de esta manera:

class DateTime 
    def localtime 
    new_offset(DateTime.now.offset) 
    end 

    def utc 
    new_offset(Rational(0, 24)) 
    end 
end 

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

1

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 
2

Se puede establecer una ENV si desea que su Time.nowDateTime.now y responder en tiempo 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" 
1

Prueba de esto, trabaja en Rubí:

DateTime.now.to_time.utc