Polecenie, aby uzyskać czas w milisekundach


286

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


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.


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.


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


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

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.


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))"'

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


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;

1

Skrypt w języku Python:

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

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'

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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.