Czy w Linuksie jest polecenie powłoki, aby uzyskać czas w milisekundach?
date -Ins
Czy w Linuksie jest polecenie powłoki, aby uzyskać czas w milisekundach?
date -Ins
Odpowiedzi:
date +%s%N
zwraca liczbę sekund + aktualne nanosekundy.
Dlatego echo $(($(date +%s%N)/1000000))
właśnie tego potrzebujesz.
Przykład:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
zwraca liczbę sekund od epoki, jeśli jest to przydatne.
%N
nie jest obsługiwany przezdate
date +%s%3N
jest szybszy (na podstawie odpowiedzi @ michael-defort)
coreutils
korzystania z MacPorts lub Homebrew - a następnie użyj gdate
polecenia. Zobacz to pytanie: stackoverflow.com/questions/9804966/…
date +"%T.%N"
zwraca bieżący czas z nanosekundami.
06:46:41.431857000
date +"%T.%6N"
zwraca bieżący czas z nanosekundami zaokrąglonymi do pierwszych 6 cyfr, czyli mikrosekund.
06:47:07.183172
date +"%T.%3N"
zwraca bieżący czas z nanosekundami zaokrąglonymi do pierwszych 3 cyfr, czyli milisekund.
06:47:42.773
Zasadniczo każde pole date
formatu polecenia może mieć opcjonalną szerokość pola.
%xN
: ładny dla szerokości pola!
Nano wynosi 10–9, a milli 10–3 . Dlatego możemy użyć trzech pierwszych znaków nanosekund, aby uzyskać milisekundy:
date +%s%3N
Od man date
:
% N nanosekund (000000000..999999999)
% s sekund od 1970-01-01 00:00:00 UTC
Źródło: Błąd serwera Jak uzyskać bieżący czas uniksowy w milisekundach w Bash? .
W systemie OS X, gdzie date
nie obsługuje %N
flagi, polecam instalację coreutils
przy użyciu Homebrew . To da ci dostęp do komendy o nazwie, gdate
która będzie się zachowywać tak date
samo jak w systemach Linux.
brew install coreutils
Aby uzyskać bardziej „rodzime” wrażenia, zawsze możesz dodać to do .bash_aliases
:
alias date='gdate'
Następnie wykonaj
$ date +%s%N
Oto jakoś przenośny hack dla Linuksa, aby uzyskać czas w milisekundach:
#!/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
Dane wyjściowe to:
3010
Jest to bardzo tania operacja, która działa z wewnętrznymi powłokami i procfs.
date
polecenie nie dostarczyło milisekund w OS X, więc użyłem aliasu z Pythona
millis(){ python -c "import time; print(int(time.time()*1000))"; }
LUB
alias millis='python -c "import time; print(int(time.time()*1000))"'
fork()
usunięciu oddzielnego procesu exec
edytuj interpreter Pythona, pozwól mu załadować biblioteki / w inny sposób zainicjuj, zapisz wynik i wyjdź, wynik ten nie będzie już dokładny.
Inne odpowiedzi są prawdopodobnie wystarczające w większości przypadków, ale pomyślałem, że dodam moje dwa centy, ponieważ napotkałem problem w systemie BusyBox .
System, o którym mowa, nie obsługuje %N
opcji formatowania i nie ma interpretera języka Python ani Perl.
Po wielu zadrapaniach w głowie, my (dzięki Dave!) Wymyśliliśmy:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Wyodrębnia sekundy i mikrosekundy z wyjścia adjtimex
(zwykle używane do ustawiania opcji zegara systemowego) i drukuje je bez nowych linii (aby się skleiły). Zauważ, że pole mikrosekund musi być wstępnie wypełnione zerami, ale to nie wpływa na pole sekund, które jest dłuższe niż sześć cyfr. Z tego powinno być trywialne przekształcenie mikrosekund na milisekundy.
Jeśli potrzebujesz końcowej nowej linii (być może dlatego, że wygląda lepiej), spróbuj
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
Należy również pamiętać, że wymaga to adjtimex
i awk
musi być dostępne. Jeśli nie, to dzięki BusyBox możesz wskazać je lokalnie za pomocą:
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
A następnie nazwij to jako
./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Lub oczywiście możesz umieścić je w swoim PATH
EDYTOWAĆ:
Powyższe działało na moim urządzeniu BusyBox. Na Ubuntu próbowałem tego samego i zdałem sobie sprawę, że adjtimex
ma różne wersje. W Ubuntu działało to, aby wyświetlać czas w sekundach z miejscami dziesiętnymi do mikrosekund (w tym końcową nową linię)
sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
Nie zrobiłbym tego jednak na Ubuntu. użyłbymdate +%s%N
Można do tego użyć Perla, nawet na egzotycznych platformach, takich jak AIX. Przykład:
#!/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;
Skrypt w języku Python:
import time
cur_time = int(time.time()*1000)
time.time()
zwraca liczbę zmiennoprzecinkową do 6 miejsc po przecinku, przynajmniej w systemie macOS.
Chciałem tylko dodać do odpowiedzi Alpera, co musiałem zrobić, aby te rzeczy działały:
Na Macu będziesz potrzebować brew install coreutils
, abyśmy mogli z niego korzystać gdate
. W przeciwnym razie w Linuksie jest to po prostu date
. Ta funkcja pomoże Ci w wykonywaniu poleceń czasowych bez konieczności tworzenia plików tymczasowych lub czegokolwiek
function timeit() {
start=`gdate +%s%N`
bash -c $1
end=`gdate +%s%N`
runtime=$(((end-start)/1000000000.0))
echo " seconds"
}
I możesz go użyć z łańcuchem:
timeit 'tsc --noEmit'
function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Gdy używasz GNU AWK od wersji 4.1, możesz załadować bibliotekę czasu i wykonać:
$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'
Spowoduje to wydrukowanie bieżącego czasu w sekundach od 1970-01-01T00: 00: 00 z dokładnością do drugiej sekundy.
the_time = gettimeofday()
Zwraca czas w sekundach, który upłynął od 1970-01-01 UTC, jako wartość zmiennoprzecinkową. Jeśli czas nie jest dostępny na tej platformie, wróć-1
i ustawERRNO
. Zwrócony czas powinien mieć dokładność poniżej sekundy , ale rzeczywista dokładność może się różnić w zależności od platformy. Jeśli standardowegettimeofday()
wywołanie systemowe C jest dostępne na tej platformie, to po prostu zwraca wartość. W przeciwnym razie, jeśli na MS-Windows, próbuje użyćGetSystemTimeAsFileTime()
.źródło: instrukcja GNU awk
W systemach Linux standardowa funkcja C getimeofday()
zwraca czas z dokładnością do mikrosekund.
Aby wyświetlić datę z czasem i strefą czasową
data + „% d-% m-% Y% T.% N% Z”
Wyjście: 22-04-2020 18: 01: 35.970289239 IST
date +%s.%N
dałby ci nanosekundy, czy możesz z tym pracować?