¿Cómo obtener la marca de tiempo UTC en Ruby?

Respuestas:

117
time = Time.now.getutc

Justificación: A mis ojos, una marca de tiempo es exactamente eso: un punto en el tiempo. Esto se puede representar con precisión con un objeto. Si necesita algo más, un valor escalar, por ejemplo, segundos desde la época de Unix, intervalos de 100 ns desde 1601 o tal vez una cadena para mostrar o almacenar la marca de tiempo en una base de datos, puede obtenerla fácilmente del objeto. Pero eso depende mucho de su uso previsto.

Decir que "una marca de tiempo verdadera es la cantidad de segundos desde que la época de Unix" falta un poco al punto, ya que esa es una forma de representar un punto en el tiempo, pero también necesita información adicional para saber que se trata un tiempo y no un número. Un Timeobjeto resuelve este problema muy bien al representar un punto en el tiempo y también ser explícito sobre lo que es .

Joey
fuente
93
Eso le da el objeto de tiempo, debe a Time.now.to_i para una verdadera marca de tiempo
rafamvc
3
En mi opinión, un objeto tiene la marca de tiempo suficiente y todavía tienes toda la libertad que necesitas. Reducirlo a un valor escalar en la mayoría de los casos no es realmente necesario.
Joey
2
Las marcas de tiempo son relativas a la época, no importa en qué zona horaria se encuentre. La respuesta de manzhikov es la mejor.
Ryan Mohr
2
Si bien es una buena explicación de por qué no usar una marca de tiempo Unix, esto no responde la pregunta OP (ni la misma pregunta que tuve cuando encontré esta publicación). Las marcas de tiempo Unix son necesarias en muchos casos (por ejemplo, para API). Incluso después de la explicación, esta respuesta no dio la forma real de obtener la marca de tiempo.
stuckj
55
@stuckj, en ningún momento la pregunta menciona una marca de tiempo de Unix. Sigo recibiendo votos negativos para esta respuesta porque la gente parece pensar que »timestamp == Unix time«, de ahí la explicación.
Joey
247

Se podría utilizar: Time.now.to_i.

manzhikov
fuente
1
¿Tendría más sentido hacer Time.now.getutc.to_i? ¿O es eso esencialmente equivalente?
stuckj
20
La marca de tiempo es la misma en todas las zonas horarias. :)
manzhikov
2
Oh si, duh. Pregunta Brainfart. :)
stuckj
¡Esta es la respuesta más apropiada!
Darlan Dieterich
46

El formato predeterminado no es muy útil, en mi opinión. Prefiero ISO8601 ya que es ordenable, relativamente compacto y ampliamente reconocido:

>> require 'time'
=> true
>> Time.now.utc.iso8601
=> "2011-07-28T23:14:04Z"
Tim Sylvester
fuente
1
Tenga en cuenta que este método proviene de ActiveSupport, no de la biblioteca estándar rubydoc.info/docs/rails/ActiveSupport%2FTimeWithZone:iso8601
n0nick el
3
@ n0nick ¿estás seguro, incluso en 2.0? Sé que lo he usado en instalaciones "vainilla" sin rieles, etc., y está dentro /usr/share/ruby/2.0/time.rb.
Tim Sylvester
15

Por lo general, la marca de tiempo no tiene zona horaria.

% irb
> Time.now.to_i == Time.now.getutc.to_i
=> true
Yuki Matsukura
fuente
1
to_fserá mejor
xis
1
depende de la situación.
Yuki Matsukura
1
Cuando llega una marca de tiempo tiene una zona horaria?
Dennis
1
la marca de tiempo no está relacionada con la zona horaria. En otras palabras, la marca de tiempo es UTC.
Yuki Matsukura
1
@YukiMatsukura En realidad, eso tampoco es del todo exacto. Una marca de tiempo ni siquiera representa una zona horaria, por lo que "la marca de tiempo es UTC" es verdadera tanto como "la marca de tiempo es caca de elefante". El problema está en la representación. La mayoría de los desarrolladores lo representan como sello de tiempo Unix (que no indica UTC ni ninguna otra zona horaria, ya que es solo un valor entero).
The Pellmeister
10

si necesita una marca de tiempo legible para humanos (como lo ha hecho la migración de rieles) ej. " 20190527141340 "

Time.now.utc.to_formatted_s(:number)  # using Rails

Time.now.utc.strftime("%Y%m%d%H%M%S") # using Ruby
Kate Kasinskaya
fuente
7

¿De qué sirve una marca de tiempo con su granularidad dada en segundos? Me resulta mucho más práctico trabajar con ellos Time.now.to_f. Heck, incluso se puede tirar una to_s.sub('.','')para deshacerse del punto decimal, o realizar un encasillado como esto: Integer(1e6*Time.now.to_f).

chava
fuente
Gracias. Integer(1e3*Time.now.to_f)Date.now()
Usé
2

Time.utc(2010, 05, 17)

August Lilleaas
fuente
-2

time = Time.zone.now()

Funcionará como

irb> Time.zone.now
=> 2017-12-02 12:06:41 UTC
Asterisco
fuente
Jonathan, ¿puedes decirme qué hay de malo en esta respuesta?
Asterisco
1
Esto depende de qué cosas de Ruby sea la zona horaria local. Funcionará como se espera solo si la TZ local es UTC.
MasterCheffinator
-6

La forma correcta es hacer una Time.now.getutc.to_ipara obtener la cantidad de marca de tiempo adecuada, ya que simplemente mostrar el número entero no siempre tiene que ser igual a la marca de tiempo utc debido a las diferencias de zona horaria.

Sumit Bisht
fuente
77
Todos los demás dijeron eso, entonces ¿por qué simplemente copiarlo, sin información nueva, 3 años tarde?
Kaspar Lee
2
Y sin signos de puntuación eso haría que la 1 oración, que es demasiado larga y no sea completamente sintácticamente correcta, más clara.
Emile Vrijdags