risposta-alla-domanda-sullo-sviluppo-web-bd.com

Comanda di ottenere il tempo in millisecondi

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

212
MOHAMED

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

Pertanto, echo $(($(date +%s%N)/1000000)) è ciò di cui hai bisogno.

ex:

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

date +%s restituisce il numero di secondi da Epoch, se questo è utile

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

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

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

    06:47:42.773
    

In generale, a ogni campo del formato del comando date può essere assegnata una larghezza di campo facoltativa.

258
Michael Defort

nano è 10-9 e milli 10-3. Quindi, possiamo usare i primi 3 caratteri di nanosecondi per ottenere il milli:

date +%s%3N

Da man date:

% N nanosecondi (000000000..999999999)

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

Fonte: Server Fault's Come ottengo il tempo Unix corrente in millisecondi usando bash? .

59
fedorqui

Su OS X, dove date non supporta il flag %N, ti consiglio di installare coreutils usando homebrew . Questo ti darà accesso ad un comando chiamato gdate che si comporterà come date fa su sistemi Linux. 

brew install coreutils

Per un'esperienza più "nativa", puoi sempre aggiungerla al tuo .bash_aliases

alias date='gdate'

quindi eseguire

$ date +%s%N
37
Joshua Cook

Il comando date 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))"; }

OR

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

Le altre risposte sono probabilmente sufficienti nella maggior parte dei casi, ma ho pensato di aggiungere i miei 2 cent perché mi sono imbattuto in un problema su un sistema busybox.

Il sistema in questione non supportava l'opzione di formato %N e non ha l'interprete python o Perl.

Dopo aver grattato molto la testa (grazie a Dave!), Ho pensato a 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 righe (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 6 cifre. Da questo dovrebbe essere banale convertire microsecondi in millisecondi.

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

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

Si noti inoltre che questo richiede che adjtimex e awk siano disponibili. In caso contrario, con busybox puoi indicarli localmente con

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

E quindi chiama quanto sopra

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

Ovviamente potresti metterli nella tua PATH

MODIFICARE:

Quanto sopra ha funzionato sul mio dispositivo busybox. Su Ubuntu ho provato la stessa cosa e ho capito che adjtimex ha diverse versioni. Su Ubuntu questo ha funzionato per produrre il tempo in secondi con cifre decimali in microsecondi (inclusa una nuova riga finale)

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

Non lo farei comunque su Ubuntu. Vorrei usare date +%s%N

4
pghalliday

ecco un hack in qualche modo portatile per Linux per guadagnare 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 internals e procfs di Shell

2
Bastian Bittorf

Volevo solo aggiungere alla risposta di @Alper cosa dovevo fare per far funzionare questa roba:

Su Mac, avrai bisogno di brew install coreutils in modo che possiamo usare gdate. Altrimenti su Linux, è solo date. E questa funzione ti aiuterà a comandare il tempo 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'

0
Chet

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;
0

script python come questo:

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