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.
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.
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:
... 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:
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
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)
¡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;
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:
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:
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().
date +%s.%N
te daría nanosegundos, ¿puedes trabajar con eso?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:
date +%s
devuelve el número de segundos desde la época, si eso es útil.fuente
%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 elgdate
comando. Vea esta pregunta: stackoverflow.com/questions/9804966/…date +"%T.%N"
Devuelve la hora actual con nanosegundos.date +"%T.%6N"
devuelve la hora actual con nanosegundos redondeados a los primeros 6 dígitos, que son microsegundos.date +"%T.%3N"
devuelve la hora actual con nanosegundos redondeados a los primeros 3 dígitos, que son milisegundos.En general, cada campo del
date
formato del comando puede recibir un ancho de campo opcional.fuente
%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:
De
man date
:Fuente: Fallas del servidor ¿Cómo obtengo el tiempo actual de Unix en milisegundos en Bash? .
fuente
En OS X, donde
date
no es compatible con la%N
bandera, recomiendo instalarcoreutils
usando Homebrew . Esto le dará acceso a un comando llamadogdate
que se comportará como lodate
hace en los sistemas Linux.Para una experiencia más "nativa", siempre puedes agregar esto a tu
.bash_aliases
:Luego ejecuta
fuente
Aquí hay un truco portátil para Linux para obtener tiempo en milisegundos:
El resultado es:
Esta es una operación muy barata, que funciona con componentes internos y procesos.
fuente
date
el comando no proporcionó milisegundos en OS X, por lo que usé un alias de pythonO
fuente
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:
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
También tenga en cuenta que esto requiere
adjtimex
yawk
estar disponible. De lo contrario, con BusyBox puede señalarlos localmente con:Y luego llame a lo anterior como
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)Sin embargo, no haría esto en Ubuntu. yo usaría
date +%s%N
fuente
Perl se puede utilizar para esto, incluso en plataformas exóticas como AIX. Ejemplo:
fuente
Un script de Python como este:
fuente
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 usarlogdate
. De lo contrario, en Linux, es justodate
. Y esta función lo ayudará a cronometrar comandos sin tener que crear archivos temporales ni nada:Y puedes usarlo con una cadena:
fuente
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:
Esto imprimirá el tiempo actual en segundos desde 1970-01-01T00: 00: 00 con una precisión de sub segundos.
En sistemas Linux, la función C estándar
getimeofday()
devuelve el tiempo con una precisión de microsegundos.fuente
Mostrar fecha con hora y zona horaria
Salida: 22-04-2020 18: 01: 35.970289239 IST
fuente