Odpowiedzi:
date +%s
zwróci liczbę sekund od epoki.
date +%s%N
zwraca sekundy i bieżące nanosekundy.
date +%s%N | cut -b1-13
poda liczbę milisekund od epoki - bieżące sekundy plus trzy lewe nanosekundy.
i od MikeyB - echo $(($(date +%s%N)/1000000))(dzielenie przez 1000 powoduje tylko mikrosekundy)
echo $(($(date +%s%N)/1000))
Możesz po prostu %3Nskrócić nanosekundy do 3 najbardziej znaczących cyfr (które następnie są milisekundami):
$ date +%s%3N
1397392146866
Działa to np. Na moim kubuntu 12.04.
Należy jednak pamiętać, że %Nmoże to nie zostać zaimplementowane w zależności od systemu docelowego. Np. Przetestowany na systemie wbudowanym (rootro-y rootkompilacji, skompilowane przy użyciu łańcucha krzyżowego ramienia innego niż HF) nie było %N:
$ date +%s%3N
1397392146%3N
(A także mój (nie zrootowany) tablet z Androidem nie ma %N).
1397392146%3Nsię 1397392146%N, ale wyjście 1397392146%3Njest to, że co bym nie widział na konsoli BusyBox mojego Android tabletki. Czy możesz wyjaśnić swoją edycję?
date +%s.%3Nodbitki 1510718281.134.
date +%N nie działa w systemie OS X, ale możesz użyć jednego z nich
ruby -e 'puts Time.now.to_f'python -c 'import time; print time.time()'node -e 'console.log(Date.now())'php -r 'echo microtime(TRUE);'DateTime.utc_now() |> DateTime.to_unix(:millisecond)wget -qO- http://www.timeapi.org/utc/now?\\s.\\Ndate +%s000node -e 'console.log(Date.now())'
php -r 'echo microtime(TRUE);'
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
date +%s000
coreutils
Moje rozwiązanie nie jest najlepsze, ale zadziałało dla mnie.
date +%s000
Po prostu potrzebowałem przekonwertować datę taką jak 2012-05-05 na milisekundy.
Dla osób, które sugerują uruchomienie programów zewnętrznych, aby uzyskać milisekundy ... w tym tempie, równie dobrze możesz to zrobić:
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
Chodzi o to: przed wybraniem jakiejkolwiek odpowiedzi z tego miejsca, pamiętaj, że nie wszystkie programy będą działać w ciągu jednej sekundy. Pomiar!
dateUruchomienie nawet na bardzo szybkiej maszynie i7 zajmuje 3 ms.
to rozwiązanie działa w systemie macOS.
jeśli rozważasz użycie skryptu bash i masz dostępny Python, możesz użyć tego kodu:
#!/bin/bash
python -c 'from time import time; print int(round(time() * 1000))'
Jeśli szukasz sposobu na wyświetlenie czasu działania skryptu, poniższe wyniki zapewnią (nie do końca dokładny) wynik:
Tak blisko początku skryptu, jak to możliwe, wprowadź następujące dane
basetime=$(date +%s%N)
To da ci wartość początkową czegoś takiego jak 1361802943996000000
Na końcu skryptu użyj następujących poleceń
echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"
który wyświetli coś podobnego
runtime: 12.383 seconds
Uwagi:
(1 * 10 ^ 09) można zastąpić 1000000000, jeśli chcesz
"scale=3"to raczej rzadkie ustawienie, które zmusza bcdo robienia tego, co chcesz. Jest o wiele więcej!
Testowałem to tylko na Win7 / MinGW ... Nie mam pod ręką odpowiedniego * nix boxa.
time <script>
Oto, jak uzyskać czas w milisekundach bez wykonywania podziału. Może jest szybciej ...
# test=`date +%s%N`
# testnum=${#test}
# echo ${test:0:$testnum-6}
1297327781715
Aktualizacja: Kolejna alternatywa w czystym bashu, która działa tylko z, bash 4.2+jest taka sama jak powyżej, ale użyj, printfaby uzyskać datę. Będzie to zdecydowanie szybsze, ponieważ żaden główny proces nie zostanie rozwidlony.
printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}
Innym haczykiem jest to, że twoja strftimeimplementacja powinna obsługiwać, %sa %Nto NIE jest przypadek na mojej maszynie testowej. Zobacz man strftimeobsługiwane opcje. Zobacz także man bashzobacz printfskładnię. -1i -2są specjalnymi wartościami dla czasu.
strftime(3)nie obsługuje, %Nwięc nie ma mowy o printfdrukowaniu nanosekund. Używam Ubuntu 14.04.
datewydaje się bardziej niezawodną opcją.
Najdokładniejszy znacznik czasu, jaki możemy uzyskać (przynajmniej dla Mac OS X), to prawdopodobnie:
python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'
1490665305.021699
Musimy jednak pamiętać, że uruchomienie zajmuje około 30 milisekund. Możemy go wyciąć do skali ułamka dwucyfrowego i na samym początku obliczyć średni narzut odczytu czasu, a następnie usunąć go z pomiaru. Oto przykład:
function getTimestamp {
echo `python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")' | cut -b1-13`
}
function getDiff {
echo "$2-$1-$MeasuringCost" | bc
}
prev_a=`getTimestamp`
acc=0
ITERATIONS=30
for i in `seq 1 $ITERATIONS`;do
#echo -n $i
a=`getTimestamp`
#echo -n " $a"
b=`echo "$a-$prev_a" | bc`
prev_a=$a
#echo " diff=$b"
acc=`echo "$acc+$b" | bc`
done
MeasuringCost=`echo "scale=2; $acc/$ITERATIONS" | bc`
echo "average: $MeasuringCost sec"
t1=`getTimestamp`
sleep 2
t2=`getTimestamp`
echo "measured seconds: `getDiff $t1 $t2`"
Możesz odkomentować polecenia echa, aby zobaczyć, jak to działa.
Wyniki dla tego skryptu są zwykle jednym z 3 następujących wyników:
measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01
Użycie daty i wyrażenia może cię tam doprowadzić, tj
X=$(expr \`date +%H\` \\* 3600 + \`date +%M\` \\* 60 + \`date +%S\`)
echo $X
Po prostu rozwiń, aby zrobić, co chcesz
Zdaję sobie sprawę, że to nie daje milisekund od epoki, ale nadal może być przydatne jako odpowiedź na niektóre przypadki, wszystko zależy od tego, do czego tak naprawdę potrzebujesz, pomnóż przez 1000, jeśli potrzebujesz liczby milisekund: D
Najprostszym sposobem byłoby stworzenie małego pliku wykonywalnego (od C np.) I udostępnienie go skryptowi.
datewielokrotnym uruchomieniem . W niektórych przypadkach data lub godzina mogą się zmieniać między uruchomieniami w miarę zapisywania polecenia. Lepiej uruchomić dateraz, przeanalizować części i wykonać obliczenia. Byłby to jeden z kilku sposobów t=$(date +%H%M%S); (( x = ${t:0:2} * 3600 + ${t:2:2} * 60 + ${t:4:2} )); echo "$x". To używa składni Bash, ponieważ pytanie jest oznaczone jako bash . Jak wspominasz, twoja odpowiedź (i moja odmiana) daje tylko sekundy dla bieżącego dnia, a nie od Epoki, a nie w milach.
(powtórz z góry) date +%Nnie działa w systemie OS X, ale możesz również użyć:
Perl (wymaga modułu Time :: Format). Być może nie jest to najlepszy moduł CPAN do użycia, ale wykonuje zadanie. Time :: Format jest ogólnie udostępniany z dystrybucjami.
perl -w -e'use Time::Format; printf STDOUT ("%s.%s\n", time, $time{"mmm"})'
datenie można go użyć i nie ma poleceń typu bash, które zaspokoją potrzebę.
datenie może być użyty jako część twojej odpowiedzi , usunę moją opinię.
Łącząc wszystkie poprzednie odpowiedzi w systemie OSX
ProductName: Mac OS X
ProductVersion: 10.11.6
BuildVersion: 15G31+
możesz to zrobić
microtime() {
python -c 'import time; print time.time()'
}
compute() {
local START=$(microtime)
#$1 is command $2 are args
local END=$(microtime)
DIFF=$(echo "$END - $START" | bc)
echo "$1\t$2\t$DIFF"
}
Jeśli chcesz wykonać proste obliczenia dotyczące powłoki, jest to łatwe i przenośne, korzystając z powyższej odpowiedzi:
now() {
python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'
}
seismo:~$ x=`now`
seismo:~$ y=`now`
seismo:~$ echo "$y - $x" | bc
5.212514
W przypadku alpejskiego linuxa (wiele obrazów dokerów) i ewentualnie innych minimalnych środowisk linuksowych możesz nadużywać adjtimex:
adjtimex | awk '/(time.tv_usec):/ { printf("%06d\n", $2) }' | head -c3
adjtimexsłuży do odczytu (i ustawiania) zmiennych czasowych jądra. Dzięki awkmożesz uzyskać mikrosekundy, headmożesz użyć tylko pierwszych 3 cyfr.
Nie mam pojęcia, jak wiarygodne jest to polecenie.
Uwaga: bezwstydnie skradzione z tej odpowiedzi