Polecenie, aby uzyskać czas w milisekundach

286

Czy w Linuksie jest polecenie powłoki, aby uzyskać czas w milisekundach?

MOHAMED
źródło
12
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.

Alper
źródło
69
nie działa w systemie Mac OS, ponieważ %Nnie jest obsługiwany przezdate
yegor256,
33
Pytanie dotyczy polecenia systemu Linux. Odpowiedź @ alper działa dobrze dla komendy date w jądrach GNU . GNUtize OSX: Zainstaluj i używaj narzędzi wiersza poleceń GNU w systemie Mac OS X
caligari
77
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.

Michael Defort
źródło
32
%xN: ładny dla szerokości pola!
fduff
1
data + „% Y% m% d.% H% M% S% 3N” przez milisekundy.
Nitin Mahesh
4
Myślę, że to lepsza odpowiedź niż ta oznaczona jako właściwa.
kcondezo
74

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? .

fedorqui „SO przestań szkodzić”
źródło
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:

alias date='gdate'

Następnie wykonaj

$ date +%s%N
Joshua Cook
źródło
10

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.

Bastian Bittorf
źródło
1
Tylko jeden jak dotąd działający na Xeon Phi BusyBox v1.27.0 (2017-09-27 13:20:28 EDT) MicroOS - chętnie zagłosuje trzy razy!
Cadoiz,
8

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))"'
Thamme Gowda
źródło
2
... 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:

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 adjtimexi awkmusi 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 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ę)

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

Nie zrobiłbym tego jednak na Ubuntu. użyłbymdate +%s%N

pghalliday
źródło
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;
Lorinczy Zsigmond
źródło
1

Skrypt w języku Python:

import time
cur_time = int(time.time()*1000)
maoyang
źródło
3
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

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'
Chet
źródło
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ć:

$ 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óć -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().

źródło: instrukcja GNU awk

W systemach Linux standardowa funkcja C getimeofday()zwraca czas z dokładnością do mikrosekund.

kvantour
źródło
0

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

Anil Agrawal
źródło