date +%s.%Ndałby ci nanosekundy, czy możesz z tym pracować?
Wrikken
1
@Wrikken Nie jest to jednak przenośne.
Camilo Martin
16
data + "% Y% m% d.% H% M% S% 3N" - Zasadniczo używam tego polecenia, aby uzyskać pełny i niepowtarzalny czas do milisekund, aby utworzyć tymczasowe nazwy plików w skrypcie uniksowym. Jeśli twój system nie jest w stanie poradzić sobie z milisekundami, możesz przejść do mikro lub nano sekund używając odpowiednio 3 do 6 i 9.
Nitin Mahesh
Spróbujdate -Ins
Dr. Osoba Osoba II
Odpowiedzi:
344
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.
date +%s%3Njest szybszy (na podstawie odpowiedzi @ michael-defort)
caligari
10
W systemie OSX musisz zainstalować wersję GNU daty w ramach coreutilskorzystania z MacPorts lub Homebrew - a następnie użyj gdatepolecenia. Zobacz to pytanie: stackoverflow.com/questions/9804966/…
Pierz
1
Chociaż data +% s% 3N wydaje się łatwiejsza lub lepsza, ale użycie jej w innych obliczeniach przesunięcia spowodowało zmniejszenie znacznika czasu o 1 milisekundę! Ale to rozwiązanie działało idealnie przy obliczaniu przesunięcia
Arsinux
341
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 dateformatu polecenia może mieć opcjonalną szerokość pola.
Czuję się tak dumny, że @Peter Mortensen dokonał jednego ze swoich wspaniałych aktywnych odczytów na jednym z moich postów :) dzięki !!
fedorqui „SO przestań szkodzić”
46
W systemie OS X, gdzie datenie obsługuje %Nflagi, polecam instalację coreutilsprzy użyciu Homebrew . To da ci dostęp do komendy o nazwie, gdatektóra będzie się zachowywać tak datesamo jak w systemach Linux.
brew install coreutils
Aby uzyskać bardziej „rodzime” wrażenia, zawsze możesz dodać to do .bash_aliases:
... jednak po fork()usunięciu oddzielnego procesu execedytuj 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.
Charles Duffy
4
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 %Nopcji formatowania i nie ma interpretera języka Python ani Perl.
Po wielu zadrapaniach w głowie, my (dzięki Dave!) Wymyśliliśmy:
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
Powyższe działało na moim urządzeniu BusyBox. Na Ubuntu próbowałem tego samego i zdałem sobie sprawę, że adjtimexma 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ę)
Wow, świetna alternatywa! Rzeczywiście twoje polecenie działa, ale nie mam pojęcia, dlaczego. Gdzie znajdę dokumentację dla polecenia awk ?! Jak do diabła dowiedziałeś się, jak zbudować ciąg, aby wyodrębnić pożądaną informację z wyjścia adjtimex?
Satria
Niesamowite rozwiązanie busybox
Codebling,
1
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;
to nie zwróci liczby milisekund, zwróci liczbę sekund wyrażoną w milisekundach. Wszystko będzie $ SECONDS000
kilianc
1
Kod Pythona @kilianc maoyang zapewnia milisekundy.
jlliagre
@jlliagre: Ale czy rzeczywista rozdzielczość czasu jest lepsza niż 16-17 ms (1/60 sekundy), czy nie?
Peter Mortensen,
Tak, Python time.time()zwraca liczbę zmiennoprzecinkową do 6 miejsc po przecinku, przynajmniej w systemie macOS.
porglezomp
1
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
Podoba mi się to rozwiązanie, ale bardziej interesuje mnie millis. Przeniesiłem tę funkcję do mojego .bashrc w Ubuntu:function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Uluaiv
1
Gdy używasz GNU AWK od wersji 4.1, możesz załadować bibliotekę czasu i wykonać:
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óć -1i ustaw ERRNO. 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 standardowe gettimeofday()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().
date +%s.%N
dałby ci nanosekundy, czy możesz z tym pracować?date -Ins
Odpowiedzi:
date +%s%N
zwraca liczbę sekund + aktualne nanosekundy.Dlatego
echo $(($(date +%s%N)/1000000))
właśnie tego potrzebujesz.Przykład:
date +%s
zwraca liczbę sekund od epoki, jeśli jest to przydatne.źródło
%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żyjgdate
polecenia. Zobacz to pytanie: stackoverflow.com/questions/9804966/…date +"%T.%N"
zwraca bieżący czas z nanosekundami.date +"%T.%6N"
zwraca bieżący czas z nanosekundami zaokrąglonymi do pierwszych 6 cyfr, czyli mikrosekund.date +"%T.%3N"
zwraca bieżący czas z nanosekundami zaokrąglonymi do pierwszych 3 cyfr, czyli milisekund.Zasadniczo każde pole
date
formatu polecenia może mieć opcjonalną szerokość pola.źródło
%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:
Od
man date
:Źródło: Błąd serwera Jak uzyskać bieżący czas uniksowy w milisekundach w Bash? .
źródło
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ć takdate
samo jak w systemach Linux.Aby uzyskać bardziej „rodzime” wrażenia, zawsze możesz dodać to do
.bash_aliases
:Następnie wykonaj
źródło
Oto jakoś przenośny hack dla Linuksa, aby uzyskać czas w milisekundach:
Dane wyjściowe to:
Jest to bardzo tania operacja, która działa z wewnętrznymi powłokami i procfs.
źródło
date
polecenie nie dostarczyło milisekund w OS X, więc użyłem aliasu z PythonaLUB
źródło
fork()
usunięciu oddzielnego procesuexec
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:
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
Należy również pamiętać, że wymaga to
adjtimex
iawk
musi być dostępne. Jeśli nie, to dzięki BusyBox możesz wskazać je lokalnie za pomocą:A następnie nazwij to jako
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ę)Nie zrobiłbym tego jednak na Ubuntu. użyłbym
date +%s%N
źródło
Można do tego użyć Perla, nawet na egzotycznych platformach, takich jak AIX. Przykład:
źródło
Skrypt w języku Python:
źródło
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 prostudate
. Ta funkcja pomoże Ci w wykonywaniu poleceń czasowych bez konieczności tworzenia plików tymczasowych lub czegokolwiekI możesz go użyć z łańcuchem:
źródło
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ć:
Spowoduje to wydrukowanie bieżącego czasu w sekundach od 1970-01-01T00: 00: 00 z dokładnością do drugiej sekundy.
W systemach Linux standardowa funkcja C
getimeofday()
zwraca czas z dokładnością do mikrosekund.źródło
Aby wyświetlić datę z czasem i strefą czasową
Wyjście: 22-04-2020 18: 01: 35.970289239 IST
źródło