¿Cómo obtener la marca de tiempo UTC en Ruby?
¿Cómo obtener la marca de tiempo UTC en Ruby?
Respuestas:
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 Time
objeto resuelve este problema muy bien al representar un punto en el tiempo y también ser explícito sobre lo que es .
Se podría utilizar: Time.now.to_i
.
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"
/usr/share/ruby/2.0/time.rb
.
Por lo general, la marca de tiempo no tiene zona horaria.
% irb
> Time.now.to_i == Time.now.getutc.to_i
=> true
to_f
será mejor
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
¿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)
.
Integer(1e3*Time.now.to_f)
Date.now()
Time.utc(2010, 05, 17)
time = Time.zone.now()
Funcionará como
irb> Time.zone.now
=> 2017-12-02 12:06:41 UTC
La forma correcta es hacer una Time.now.getutc.to_i
para 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.