¿Cómo se convierte una marca de tiempo de Unix (segundos desde la época) a Ruby DateTime?
369
DateTime.strptime
puede manejar segundos desde la época. El número debe convertirse en una cadena:
require 'date'
DateTime.strptime("1318996912",'%s')
%Q
tho.Time
es necesario en lugar deDateTime
. Así que useTime.strptime("1318996912345",'%Q').to_f
y verá los milisegundos preservados, mientrasDateTime.strptime("1318996912345",'%Q').to_f
que no los conserva.Lo siento, breve momento de falla de sinapsis. Aquí está la respuesta real.
Breve ejemplo (esto tiene en cuenta la zona horaria actual del sistema):
Actualización adicional (para UTC):
Actualización reciente : hice una evaluación comparativa de las mejores soluciones en este hilo mientras trabajaba en un servicio de alta disponibilidad hace una semana o dos, y me sorprendió encontrar que tiene un
Time.at(..)
rendimiento superiorDateTime.strptime(..)
(actualización: agregó más puntos de referencia).fuente
Time.at
tenga un rendimiento superiorDateTime.strptime
. Este último tiene que analizar una cadena, que generalmente es mucho más lenta que tomar un número directamente.DateTime.strptime
porque está creando dos nuevas cadenas cada iteración, lo cual es muy costoso. No es solo el análisis de la cadena como dijoManejo de zona horaria
Solo quiero aclarar, a pesar de que esto se ha comentado para que las personas futuras no se pierdan esta distinción muy importante.
muestra un valor de retorno en UTC y requiere que los segundos sean una cadena y genera un objeto de hora UTC, mientras que
muestra un valor de retorno en el huso horario LOCAL, normalmente requiere un argumento FixNum, pero el objeto Tiempo en sí todavía está en UTC aunque la pantalla no lo esté.
Entonces, aunque pasé el mismo número entero a ambos métodos, aparentemente obtuve dos resultados diferentes debido a cómo funciona el
#to_s
método de la clase . Sin embargo, como @Eero tuvo que recordarme dos veces:Una comparación de igualdad entre los dos valores devueltos aún devuelve verdadero. Nuevamente, esto se debe a que los valores son básicamente los mismos (aunque son diferentes clases, el
#==
método se encarga de esto por usted), pero el#to_s
método imprime cadenas drásticamente diferentes. Aunque, si miramos las cadenas, podemos ver que en realidad son la misma hora, solo impresas en diferentes zonas horarias.Método Argumento Aclaración
Los documentos también dicen "Si se proporciona un argumento numérico, el resultado es en hora local". lo cual tiene sentido, pero fue un poco confuso para mí porque no dan ningún ejemplo de argumentos no enteros en los documentos. Entonces, para algunos ejemplos de argumentos no enteros:
no puede usar un argumento String, pero puede usar un argumento Time en
Time.at
y devolverá el resultado en la zona horaria del argumento:Puntos de referencia
Después de una discusión con @AdamEberlin sobre su respuesta, decidí publicar puntos de referencia ligeramente modificados para hacer que todo sea lo más igual posible. Además, nunca quiero tener que volver a construirlos, así que este es un lugar tan bueno como cualquier otro para salvarlos.
Time.at (int) .to_datetime ~ 2.8x más rápido
**** editado para no ser completamente y totalmente incorrecto en todos los sentidos ****
**** puntos de referencia agregados ****
fuente
Time.at(1318996912) == DateTime.strptime("1318996912",'%s')
en una zona horaria que no sea UTC y verá!Time.use_zone "Samoa" do Time.at(1318996912) == DateTime.strptime("1318996912",'%s') end
para verificar que los tiempos son iguales, no hay marca de tiempo LOCAL, y en ambos casos la marca de tiempo de Unix se interpreta como en UTC.Time.at
presenta el objeto de tiempo que resulta en la zona horaria local, yDateTime.strptime
presenta el objeto DateTime que resulta en UTC, pero independientemente de presentación son iguales, ya que son el equivalente momento en el tiempo.Time.at(1318996912) # => 2011-10-19 00:01:52 -0400
muestra un valor de retorno en la zona horaria LOCAL no parece ser precisa ... ¿Puede verificar? Creo que su declaración solo sería cierta si la usaraTime.zone.at(1318996912)
Un comando para convertir la fecha y hora al formato Unix y luego a una cadena
finalmente strftime se usa para formatear la fecha
Ejemplo:
fuente
Time.now.utc.to_i
.Esto le indica la fecha del número de segundos en el futuro desde el momento en que ejecuta el código.
pone (tiempo)
De acuerdo con la hora actual, estoy respondiendo la pregunta que imprime
047-05-14 05:16:16 +0000
(mil millones de segundos en el futuro)o si quieres contar mil millones de segundos de un momento en particular, está en formato
Time.mktime(year, month,date,hours,minutes)
pone ("Sería 1 mil millones de segundos en:" + tiempo)
fuente
Si solo quería una Fecha, puede hacer
Date.strptime(invoice.date.to_s, '%s')
dondeinvoice.date
viene en forma de unaFixnum
y luego convertirla en unaString
.fuente
Time.at(1500923406).to_date.to_s
=>"2017-07-24"