Comando para obtener tiempo en milisegundos

286

¿Hay un comando de shell en Linux para obtener el tiempo en milisegundos?

MOHAMED
fuente
12
date +%s.%Nte daría nanosegundos, ¿puedes trabajar con eso?
Escrito
1
@Wrikken Sin embargo, esto no es del todo portátil.
Camilo Martin
16
date + "% Y% m% d.% H% M% S% 3N" - Generalmente uso este comando para obtener la fecha completa y el tiempo único hasta milisegundos para crear los nombres de archivos temporales en unix bash script. Si su sistema no puede hacer frente a milisegundos, puede ir a micro o nano segundos usando 3 a 6 y 9 respectivamente.
Nitin Mahesh
Pruebadate -Ins
Dr. Person Person II

Respuestas:

343

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.

Alper
fuente
69
no funciona en Mac OS, ya %Nque no es compatible condate
yegor256
33
La pregunta es pedir el comando de Linux. La respuesta de @ alper funciona bien para el comando date con GNU coreutils . GNUtize su OSX: instale y use las herramientas de línea de comandos GNU en Mac OS X
caligari
77
date +%s%3Nes más rápido (basado en la respuesta de @ michael-defort)
caligari
10
En OSX, debe instalar la versión de fecha GNU como parte del coreutilsuso de MacPorts o Homebrew, luego use el gdatecomando. Vea esta pregunta: stackoverflow.com/questions/9804966/…
Pierz
1
Aunque date +% s% 3N parece ser más fácil o mejor, ¡pero usarlo en algún otro cálculo de compensación causó que la marca de tiempo se redujera en 1 milisegundo! Pero esta solución funcionó perfectamente con el cálculo de compensación
Arsinux el
341
  • 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 dateformato del comando puede recibir un ancho de campo opcional.

Michael Defort
fuente
32
%xN: agradable para el ancho del campo!
fduff
1
fecha + "% Y% m% d.% H% M% S% 3N" durante milisegundos.
Nitin Mahesh
44
Supongo que esta es una mejor respuesta que la que está marcada como la correcta.
kcondezo
74

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? .

fedorqui 'así que deja de dañar'
fuente
Me siento muy orgulloso de que @ Peter Mortensen haya hecho una de sus magníficas lecturas activas en una de mis publicaciones :) ¡gracias!
Fedorqui 'SO deja de dañar'
46

En OS X, donde dateno es compatible con la %Nbandera, recomiendo instalar coreutilsusando Homebrew . Esto le dará acceso a un comando llamado gdateque se comportará como lo datehace 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
Joshua Cook
fuente
10

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.

Bastian Bittorf
fuente
1
Solo uno hasta ahora que funcionó en el Xeon Phi BusyBox v1.27.0 (2017-09-27 13:20:28 EDT) MicroOS - ¡con mucho gusto votará tres veces!
Cadoiz,
8

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))"'
Thamme Gowda
fuente
2
... sin embargo, una vez que haya fork()editado un proceso separado, execedite 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.
Charles Duffy
4

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 %Nopció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 adjtimexy awkestar 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 adjtimextiene 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

pghalliday
fuente
¡Guau, gran alternativa! De hecho, su comando funciona, pero no tengo idea de por qué. ¿Dónde encuentro una documentación para el comando awk? ¿Cómo demonios descubriste cómo construir la cadena para extraer la información deseada de la salida adjtimex?
Satria
Impresionante solución busybox
Codebling
1

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;
Lorinczy Zsigmond
fuente
1

Un script de Python como este:

import time
cur_time = int(time.time()*1000)
maoyang
fuente
3
Esto no devolverá el número de milisegundos, devolverá el número de segundos expresados ​​en milisegundos. Todo será $ SECONDS000
kilianc
1
El código Python de @kilianc maoyang proporciona milisegundos.
jlliagre
@jlliagre: ¿Pero la resolución de tiempo real es mejor que 16-17 ms (1/60 segundos) o no?
Peter Mortensen el
Sí, Python time.time()devuelve un flotante a 6 decimales, al menos en macOS.
porglezomp
1

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'
Chet
fuente
Me gusta esta solución pero estoy más interesado en millis. Porté esta función a mi .bashrc en ubuntu:function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Uluaiv
1

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 -1y conjunto ERRNO. 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 la gettimeofday()llamada estándar del sistema C está disponible en esta plataforma, simplemente devuelve el valor. De lo contrario, si está en MS-Windows, intenta usarlo GetSystemTimeAsFileTime().

fuente: manual de GNU awk

En sistemas Linux, la función C estándar getimeofday()devuelve el tiempo con una precisión de microsegundos.

kvantour
fuente
0

Mostrar fecha con hora y zona horaria

fecha + "% d-% m-% Y% T.% N% Z"

Salida: 22-04-2020 18: 01: 35.970289239 IST

Anil Agrawal
fuente