¿Hay un comando de shell en Linux para obtener el tiempo en milisegundos?
date -Ins
¿Hay un comando de shell en Linux para obtener el tiempo en milisegundos?
date -Ins
Respuestas:
date +%s%N
devuelve el número de segundos + nanosegundos actuales.
Por echo $(($(date +%s%N)/1000000))
lo tanto, es lo que necesitas.
Ejemplo:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
devuelve el número de segundos desde la época, si eso es útil.
%N
que no es compatible condate
date +%s%3N
es más rápido (basado en la respuesta de @ michael-defort)
coreutils
uso de MacPorts o Homebrew, luego use el gdate
comando. Vea esta pregunta: stackoverflow.com/questions/9804966/…
date +"%T.%N"
Devuelve la hora actual con nanosegundos.
06:46:41.431857000
date +"%T.%6N"
devuelve la hora actual con nanosegundos redondeados a los primeros 6 dígitos, que son microsegundos.
06:47:07.183172
date +"%T.%3N"
devuelve la hora actual con nanosegundos redondeados a los primeros 3 dígitos, que son milisegundos.
06:47:42.773
En general, cada campo del date
formato del comando puede recibir un ancho de campo opcional.
%xN
: agradable para el ancho del campo!
Nano es 10 −9 y milli 10 −3 . Por lo tanto, podemos usar los tres primeros caracteres de nanosegundos para obtener los milisegundos:
date +%s%3N
De man date
:
% N nanosegundos (000000000..999999999)
% s segundos desde 1970-01-01 00:00:00 UTC
Fuente: Fallas del servidor ¿Cómo obtengo el tiempo actual de Unix en milisegundos en Bash? .
En OS X, donde date
no es compatible con la %N
bandera, recomiendo instalar coreutils
usando Homebrew . Esto le dará acceso a un comando llamado gdate
que se comportará como lo date
hace en los sistemas Linux.
brew install coreutils
Para una experiencia más "nativa", siempre puedes agregar esto a tu .bash_aliases
:
alias date='gdate'
Luego ejecuta
$ date +%s%N
Aquí hay un truco portátil para Linux para obtener tiempo en milisegundos:
#!/bin/sh
read up rest </proc/uptime; t1="${up%.*}${up#*.}"
sleep 3 # your command
read up rest </proc/uptime; t2="${up%.*}${up#*.}"
millisec=$(( 10*(t2-t1) ))
echo $millisec
El resultado es:
3010
Esta es una operación muy barata, que funciona con componentes internos y procesos.
date
el comando no proporcionó milisegundos en OS X, por lo que usé un alias de python
millis(){ python -c "import time; print(int(time.time()*1000))"; }
O
alias millis='python -c "import time; print(int(time.time()*1000))"'
fork()
editado un proceso separado, exec
edite su intérprete de Python, deje que cargue sus bibliotecas / de lo contrario se inicialice, escriba su resultado y salga, ese resultado ya no será preciso.
Las otras respuestas son probablemente suficientes en la mayoría de los casos, pero pensé que agregaría mis dos centavos ya que me encontré con un problema en un sistema BusyBox .
El sistema en cuestión no admitía la %N
opción de formato y no tiene un intérprete de Python o Perl.
Después de rascarse mucho la cabeza, nosotros (¡gracias Dave!) Se nos ocurrió esto:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Extrae los segundos y microsegundos de la salida de adjtimex
(normalmente se usa para configurar las opciones para el reloj del sistema) y los imprime sin nuevas líneas (para que se peguen). Tenga en cuenta que el campo de microsegundos tiene que rellenarse previamente con ceros, pero esto no afecta el campo de segundos, que de todos modos tiene más de seis dígitos. De esto debería ser trivial convertir microsegundos a milisegundos.
Si necesita una nueva línea final (tal vez porque se ve mejor), intente
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
También tenga en cuenta que esto requiere adjtimex
y awk
estar disponible. De lo contrario, con BusyBox puede señalarlos localmente con:
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
Y luego llame a lo anterior como
./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
O, por supuesto, podrías ponerlos en tu PATH
EDITAR:
Lo anterior funcionó en mi dispositivo BusyBox. En Ubuntu probé lo mismo y me di cuenta de que adjtimex
tiene diferentes versiones. En Ubuntu, esto funcionó para generar el tiempo en segundos con decimales en microsegundos (incluida una nueva línea final)
sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
Sin embargo, no haría esto en Ubuntu. yo usaríadate +%s%N
Perl se puede utilizar para esto, incluso en plataformas exóticas como AIX. Ejemplo:
#!/usr/bin/perl -w
use strict;
use Time::HiRes qw(gettimeofday);
my ($t_sec, $usec) = gettimeofday ();
my $msec= int ($usec/1000);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime ($t_sec);
printf "%04d-%02d-%02d %02d:%02d:%02d %03d\n",
1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec;
Un script de Python como este:
import time
cur_time = int(time.time()*1000)
time.time()
devuelve un flotante a 6 decimales, al menos en macOS.
Solo quería agregar a la respuesta de Alper lo que tenía que hacer para que esto funcionara:
En Mac, lo necesitará brew install coreutils
, para que podamos usarlo gdate
. De lo contrario, en Linux, es justo date
. Y esta función lo ayudará a cronometrar comandos sin tener que crear archivos temporales ni nada:
function timeit() {
start=`gdate +%s%N`
bash -c $1
end=`gdate +%s%N`
runtime=$(((end-start)/1000000000.0))
echo " seconds"
}
Y puedes usarlo con una cadena:
timeit 'tsc --noEmit'
function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Cuando usa GNU AWK desde la versión 4.1, puede cargar la biblioteca de tiempo y hacer:
$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'
Esto imprimirá el tiempo actual en segundos desde 1970-01-01T00: 00: 00 con una precisión de sub segundos.
the_time = gettimeofday()
Devuelva el tiempo en segundos transcurrido desde 1970-01-01 UTC como un valor de punto flotante. Si el tiempo no está disponible en esta plataforma, el retorno-1
y conjuntoERRNO
. El tiempo devuelto debe tener una precisión de menos de un segundo , pero la precisión real puede variar según la plataforma. Si lagettimeofday()
llamada estándar del sistema C está disponible en esta plataforma, simplemente devuelve el valor. De lo contrario, si está en MS-Windows, intenta usarloGetSystemTimeAsFileTime()
.fuente: manual de GNU awk
En sistemas Linux, la función C estándar getimeofday()
devuelve el tiempo con una precisión de microsegundos.
Mostrar fecha con hora y zona horaria
fecha + "% d-% m-% Y% T.% N% Z"
Salida: 22-04-2020 18: 01: 35.970289239 IST
date +%s.%N
te daría nanosegundos, ¿puedes trabajar con eso?