Pregunta ¿Cómo obtener el tiempo Unix actual en milisegundos en bash?


¿Cómo obtengo la hora actual de Unix en milisegundos (es decir, la cantidad de milisegundos desde la época de Unix del 1 de enero de 1970)?


197
2018-06-14 16:04


origen




Respuestas:


Esta:

date +%s 

devolverá el número de segundos desde la época.

Esta:

date +%s%N

Devuelve los segundos y nanosegundos actuales.

Asi que:

date +%s%N | cut -b1-13

le dará el número de milisegundos desde la época - segundos actuales más los tres nanosegundos de la izquierda.


y de MikeyB - echo $(($(date +%s%N)/1000000)) (dividiendo por 1000 solo lleva a microsegundos)


233
2018-06-14 16:10



Me pregunto cuantos ms agrega el corte :-) - Kyle Brandt♦
O si desea hacerlo todo en el shell, evitando la costosa sobrecarga de un proceso adicional (en realidad, estamos evitando el problema cuando cambia el número de dígitos en% + s + N): echo $(($(date +%s%N)/1000)) - MikeyB
Es el principio del asunto ... evita los números mágicos y codifica lo que realmente media. - MikeyB
Creo que vale la pena señalar que el hombre pidió Unix, no Linux, y la respuesta principal actual (fecha +% s% N) no funciona en mi sistema AIX. - Pete
@Pete +1 Igual para OS X, y FreeBSD - ocodo


Usted puede simplemente utilizar %3N para truncar los nanosegundos a los 3 dígitos más significativos (que luego son milisegundos):

$ date +%s%3N
1397392146866

Esto funciona, por ejemplo. en mi kubuntu 12.04.

Pero ten en cuenta que %N no se puede implementar dependiendo de su sistema de destino. P.ej. no se probó en un sistema integrado (rootfs de buildroot, compilado usando una cadena de herramientas que no es de HF). %N:

$ date +%s%3N
1397392146%3N

(Y también mi tableta Android (no rooteada) no tiene %N).


79
2018-04-13 12:34



@warren: Vi que editaste y cambiaste el 1397392146%3N a 1397392146%N, pero la salida de 1397392146%3N Es eso lo que realmente había visto en la consola de la busybox de mi tableta Android. ¿Podría explicar su edición? - Joe
El comentario de Warren de la historia se "cambió de 3 a 6, ya que 3 solo te lleva a microsegundos". Su edición parece completamente falsa; Deberías hacerlo retroceder. - bukzor
Esta es una característica de GNU coreutils específicamente. En última instancia, esto se implementa en gnulib aquí: github.com/gagern/gnulib/blob/…. - telotortium
probablemente un punto allí tiene sentido. date +%s.%3N huellas dactilares 1510718281.134. - darksky


date +%N no funciona en OS X, pero puedes usar uno de

  • rubí: ruby -e 'puts Time.now.to_f'
  • pitón: python -c 'import time; print time.time()'
  • node.js: node -e 'console.log(Date.now())'
  • PHP: php -r 'echo microtime(TRUE);'
  • los internets: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
  • o por milisegundos redondeados al segundo más cercano date +%s000

51
2017-09-02 11:16



por completitud... node -e 'console.log(Date.now())' - slf
Utilizando PHP: php -r 'echo microtime(TRUE);' - TachyonVortex
Claro, solo hay que esperar a que los intérpretes se calienten. Esto funciona, también: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N - Camilo Martin
O si tu en realidad no necesito los milisegundos pero solo el formato correcto: date +%s000 - Lenar Hoyt
apple.stackexchange.com/questions/135742/… tiene instrucciones para hacer esto en OSX a través de Brew's coreutils - sameers


Simplemente tirar esto, pero creo que la fórmula correcta con la división sería:

echo $(($(date +%s%N)/1000000))

8
2017-09-07 21:22





Mi solución no es la mejor pero funcionó para mí.

date +%s000

Solo necesitaba convertir una fecha como 2012-05-05 a milisegundos.


6
2018-05-09 20:11



Hack increíble, lol :) - k06a
Debes ser alguien entre mis compañeros de trabajo. - Nakilon


Para las personas que sugieren ejecutar programas externos para obtener el milisegundos ... a ese ritmo, también podrías hacer esto:

wget -qO- http://www.timeapi.org/utc/now?\\s.\\N

El punto es: antes de elegir una respuesta desde aquí, tenga en cuenta que no todos los programas se ejecutarán en un segundo entero. ¡Medida!


6
2018-06-23 13:17



No estás preguntando al sistema local por el tiempo. Lo que supongo está implícito en la pregunta. También dependes de una conexión de red. - orkoden
@orkoden La pregunta pregunta explícitamente por "número de milisegundos desde la época de Unix el 1 de enero de 1970". Además, me refiero a cómo no deberías disparar todo Ruby o Python (o wget) solo para ganar tiempo, ya sea a través de un canal rápido o de milisegundos, no importa. - Camilo Martin
Sí, entendí que estaba dando una solución peor para resaltar las fallas de las soluciones malas. Probé varias soluciones y medí el tiempo. lpaste.net/119499 Los resultados son bastante interesantes. Incluso en una máquina i7 muy rápida date tarda 3 ms en ejecutarse. - orkoden
@orkoden Pruebas agradables! ¿Qué sistema operativo? Esto podría tener que ver con el proceso de generación de gastos generales. - Camilo Martin
@Nakilon y esta es la razón por la que no se debe confiar en las conveniencias con capacidad de rizo como aquellas para la producción de cualquier cosa. - Camilo Martin


Esta solución funciona en macOS.

Si considera usar un script de bash y tiene Python disponible, puede usar este código:

#!/bin/bash

python -c 'from time import time; print int(round(time() * 1000))'

3
2018-02-05 14:26



¿Por qué el voto negativo? - Frank Thonig
No parece particularmente justificado. La sugerencia de la flecha hacia abajo dice "Esta respuesta no es útil", pero IMO es útil. Tal vez querían que lo hicieras un script de Python en su lugar. Eso sería más simple y también funcionaría bien como un comando de bash. - Andrew Schulman
No te preocupes demasiado por los votos negativos (no fue el mío) ... especialmente si son anónimos (de los cuales uno no puede aprender lo que parece estar mal, ¿verdad?). Solo para ayudarte a procesarlo ... aquí va otro +1 ... adivina qué: TÚ también puedes "votar" ahora, ¿verdad? - Pierre.Vriens
El downvote parece haber sido causado por un problema con el sistema. Desde entonces ha sido eliminado, nuevamente por el sistema. - Michael Hampton♦


Si está buscando una manera de mostrar la cantidad de tiempo que se ejecutó su script, lo siguiente proporcionará un resultado (no completamente exacto):

Tan cerca del comienzo de su script como pueda, ingrese los siguientes

basetime=$(date +%s%N)

Esto te dará un valor inicial de algo así como 1361802943996000000

Al final de su script, use lo siguiente

echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"

que mostrará algo como

runtime: 12.383 seconds

Notas:

(1 * 10 ^ 09) puede reemplazarse con 1000000000 si lo desea

"scale=3" Es un lugar bastante raro que coacciona. bc hacer lo que quieras ¡Hay mucho más!

Solo probé esto en Win7 / MinGW ... No tengo una caja * nix adecuada a mano.


2
2018-02-25 14:48



o simplemente podrías usar time <script> - warren


Aquí es cómo obtener tiempo en milisegundos sin realizar la división. Tal vez sea más rápido ...

# test=`date +%s%N`
# testnum=${#test}
# echo ${test:0:$testnum-6}
1297327781715

Actualización: Otra alternativa en bash puro que funciona solo con bash 4.2+ es igual que el anterior pero usa printf para conseguir la fecha. Definitivamente será más rápido porque ningún proceso se desvía del principal.

printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}

Otra captura aquí es que tu strftime la implementación debe apoyar %s y %N que NO es el caso en mi máquina de prueba. Ver man strftime para opciones soportadas. Ver también man bashpara ver printf sintaxis. -1 y -2 Son valores especiales para el tiempo.


2
2018-02-10 09:05



Parece que mi strftime(3) no soporta %N así que no hay manera de printf para imprimir nanosegundos. Estoy usando Ubuntu 14.04. - haridsv
@haridsv, sí, no está en glibc. date Parece ser la opción más confiable. - akostadinov


La marca de tiempo más precisa que podemos obtener (al menos para Mac OS X) es probablemente esta:

python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'

1490665305.021699

Pero debemos tener en cuenta que se tarda unos 30 milisegundos en ejecutarse. Podemos reducirlo a la escala de la fracción de 2 dígitos y, al principio, calcular la gastos generales promedio de leer el tiempo, y luego quitarlo de la medida. Aquí hay un ejemplo:

function getTimestamp {
  echo `python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")' | cut -b1-13` 
}
function getDiff {
  echo "$2-$1-$MeasuringCost" | bc
}
prev_a=`getTimestamp`
acc=0
ITERATIONS=30
for i in `seq 1 $ITERATIONS`;do 
  #echo -n $i 
  a=`getTimestamp`
  #echo -n "   $a"
  b=`echo "$a-$prev_a" | bc`
  prev_a=$a
  #echo "  diff=$b"
  acc=`echo "$acc+$b" | bc`
done
MeasuringCost=`echo "scale=2; $acc/$ITERATIONS" | bc`
echo "average: $MeasuringCost sec"
t1=`getTimestamp`
sleep 2
t2=`getTimestamp`
echo "measured seconds: `getDiff $t1 $t2`"

Puedes descomentar los comandos de eco para ver mejor cómo funciona.

Los resultados de este script son generalmente uno de estos 3 resultados:

measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01

2
2018-03-28 02:13