Comando per ottenere il tempo in millisecondi


286

Esiste un comando shell in Linux per ottenere il tempo in millisecondi?


12
date +%s.%Nti darebbe nanosecondi, puoi lavorare con quello?
Wrikken,

1
@Wrikken Questo non è abbastanza portatile però.
Camilo Martin,

16
data + "% Y% m% d.% H% M% S% 3N" - Generalmente utilizzo questo comando per ottenere il tempo completo e unico fino a milli secondi per creare i nomi di file temporanei nello script basix unix. Se il tuo sistema non è in grado di far fronte a milioni di secondi, puoi passare a micro o nano secondi usando rispettivamente da 3 a 6 e 9.
Nitin Mahesh,

Provadate -Ins
Dr. Person Person II

Risposte:


344

date +%s%N restituisce il numero di secondi + nanosecondi correnti.

Pertanto, echo $(($(date +%s%N)/1000000))è quello che ti serve.

Esempio:

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

date +%s restituisce il numero di secondi dall'epoca, se utile.


69
non funziona su Mac OS, poiché %Nnon è supportato dadate
yegor256 il

33
La domanda è chiedere il comando Linux. La risposta di @ alper funziona bene per il comando data con core GNU GNU . GNUtize OSX: Installa e usa GNU Command Line Tools su Mac OS X
caligari,

77
date +%s%3Nè più veloce (basato sulla risposta di @ michael-defort)
caligari,

10
Su OSX è necessario installare la versione GNU di date come parte coreutilsdell'utilizzo di MacPorts o Homebrew - quindi utilizzare il gdatecomando. Vedi questa domanda: stackoverflow.com/questions/9804966/…
Pierz,

1
Anche se la data +% s% 3N sembra essere più semplice o migliore, ma l'utilizzo in altri calcoli di offset ha comportato una riduzione del timestamp di 1 millisecondo! Ma questa soluzione ha funzionato perfettamente con il calcolo dell'offset
Arsinux il

342
  • date +"%T.%N" restituisce l'ora corrente con nanosecondi.

    06:46:41.431857000
  • date +"%T.%6N" restituisce l'ora corrente con i nanosecondi arrotondati alle prime 6 cifre, ovvero i microsecondi.

    06:47:07.183172
  • date +"%T.%3N" restituisce l'ora corrente con i nanosecondi arrotondati alle prime 3 cifre, ovvero i millisecondi.

    06:47:42.773

In generale, a ogni campo del dateformato del comando può essere assegnata una larghezza di campo opzionale.


32
%xN: bello per la larghezza del campo!
fduff,

1
data + "% Y% m% d.% H% M% S% 3N" per milli secondi.
Nitin Mahesh,

4
Immagino che questa sia una risposta migliore di quella contrassegnata come quella giusta.
kcondezo,

74

Nano è 10 −9 e milli 10 −3 . Quindi, possiamo usare i primi tre caratteri di nanosecondi per ottenere i millisecondi:

date +%s%3N

Da man date:

% N nanosecondi (000000000..999999999)

% s secondi dal 1970-01-01 00:00:00 UTC

Fonte: Server Fault Come posso ottenere l'ora corrente di Unix in millisecondi in Bash? .


Sono così orgoglioso che @Peter Mortensen abbia fatto una delle sue superbe letture attive su uno dei miei post :) grazie !!
fedorqui "SO smettere di danneggiare" il

46

Su OS X, dove datenon supporta il %Nflag, ti consiglio di installare coreutilsusando Homebrew . Questo ti darà accesso a un comando chiamato gdateche si comporterà come datesui sistemi Linux.

brew install coreutils

Per un'esperienza più "nativa", puoi sempre aggiungere questo al tuo .bash_aliases:

alias date='gdate'

Quindi eseguire

$ date +%s%N

10

Ecco un hack portatile in qualche modo per Linux per ottenere tempo in millisecondi:

#!/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

L'output è:

3010

Questa è un'operazione molto economica, che funziona con gli interni e i proc della shell.


1
Solo uno finora che ha funzionato su Xeon Phi BusyBox v1.27.0 (2017-09-27 13:20:28 EDT) MicroOS - sarebbe felice di votare tre volte!
Cadoiz

8

date command non ha fornito milli secondi su OS X, quindi ha usato un alias da Python

millis(){  python -c "import time; print(int(time.time()*1000))"; }

O

alias millis='python -c "import time; print(int(time.time()*1000))"'

2
... tuttavia, una volta fork()annullato un processo separato, execed il tuo interprete Python, lascia che carichi le sue librerie / altrimenti inizializzi, scriva il suo risultato ed esca, quel risultato non sarà più accurato.
Charles Duffy,

4

Le altre risposte sono probabilmente sufficienti nella maggior parte dei casi, ma ho pensato di aggiungere i miei due centesimi quando ho riscontrato un problema su un sistema BusyBox .

Il sistema in questione non supportava l' %Nopzione di formattazione e non ha interprete Python o Perl.

Dopo aver grattato la testa, noi (grazie Dave!) Ci siamo inventati questo:

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

Estrae i secondi e i microsecondi dall'output di adjtimex (normalmente utilizzato per impostare le opzioni per l'orologio di sistema) e li stampa senza nuove linee (in modo che vengano incollati insieme). Si noti che il campo dei microsecondi deve essere pre-riempito con zeri, ma ciò non influisce sul campo dei secondi che è comunque più lungo di sei cifre. Da questo dovrebbe essere banale convertire i microsecondi in millisecondi.

Se hai bisogno di una nuova riga finale (forse perché sembra migliore) allora prova

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"

Si noti inoltre che ciò richiede adjtimexe awkdi essere disponibile. Altrimenti con BusyBox puoi indicarli localmente con:

ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk

E quindi chiama quanto sopra come

./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

O ovviamente potresti metterli nel tuo PATH

MODIFICARE:

Quanto sopra ha funzionato sul mio dispositivo BusyBox. Su Ubuntu ho provato la stessa cosa e ho capito che adjtimexha versioni diverse. Su Ubuntu ha funzionato per generare il tempo in secondi con i decimali in microsecondi (inclusa una nuova riga finale)

sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'

Non lo farei su Ubuntu però. io usereidate +%s%N


Caspita, ottima alternativa! In effetti il ​​tuo comando funziona, ma non ho idea del perché. Dove trovo una documentazione per il comando awk ?! Come diavolo hai scoperto come costruire la stringa per estrarre le informazioni desiderate dall'output di adjtimex?
Satria,

Impressionante soluzione busybox
Codebling

1

Perl può essere usato per questo, anche su piattaforme esotiche come AIX. Esempio:

#!/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;

1

Uno script Python come questo:

import time
cur_time = int(time.time()*1000)

3
questo non restituirà il numero di millisecondi, questo restituirà il numero di secondi espresso in millisecondi. Tutto sarà $ SECONDS000
kilianc il

1
Il codice Python di @kilianc maoyang fornisce millisecondi.
jlliagre,

@jlliagre: Ma la risoluzione temporale effettiva è migliore di 16-17 ms (1/60 di secondo) o no?
Peter Mortensen,

Sì, Python's time.time()restituisce un float a 6 cifre decimali, almeno su macOS.
porglezomp,

1

Volevo solo aggiungere alla risposta di Alper cosa dovevo fare per far funzionare queste cose:

Su Mac, ne avrai bisogno brew install coreutils, così possiamo usarlo gdate. Altrimenti su Linux, è solo date. E questa funzione ti aiuterà a cronometrare i comandi senza dover creare file temporanei o altro:

function timeit() {
    start=`gdate +%s%N`
    bash -c $1
    end=`gdate +%s%N`
    runtime=$(((end-start)/1000000000.0))
    echo " seconds"
}

E puoi usarlo con una stringa:

timeit 'tsc --noEmit'

Mi piace questa soluzione ma sono più interessato ai millis. Ho portato questa funzione sul mio .bashrc in Ubuntu:function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Uluaiv

1

Quando si utilizza GNU AWK dalla versione 4.1, è possibile caricare la libreria temporale ed eseguire:

$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'

In questo modo verrà stampata l'ora corrente in secondi dal 1970-01-01T00: 00: 00 con precisione al secondo secondo.

the_time = gettimeofday() Restituisce il tempo in secondi trascorso dal 1970-01-01 UTC come valore in virgola mobile. Se l'ora non è disponibile su questa piattaforma, tornare -1e impostare ERRNO. Il tempo restituito dovrebbe avere una precisione inferiore al secondo , ma la precisione effettiva può variare in base alla piattaforma. Se la gettimeofday()chiamata di sistema C standard è disponibile su questa piattaforma, restituisce semplicemente il valore. Altrimenti, se su MS-Windows, tenta di utilizzare GetSystemTimeAsFileTime().

fonte: manuale GNU awk

Sui sistemi Linux, la funzione C standard getimeofday()restituisce il tempo con precisione in microsecondi.


0

Per mostrare la data con ora e fuso orario

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.