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 %3N
skró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 %N
moż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%3N
się 1397392146%N
, ale wyjście 1397392146%3N
jest to, że co bym nie widział na konsoli BusyBox mojego Android tabletki. Czy możesz wyjaśnić swoją edycję?
date +%s.%3N
odbitki 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.\\N
date +%s000
node -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!
date
Uruchomienie 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 bc
do 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, printf
aby 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 strftime
implementacja powinna obsługiwać, %s
a %N
to NIE jest przypadek na mojej maszynie testowej. Zobacz man strftime
obsługiwane opcje. Zobacz także man bash
zobacz printf
składnię. -1
i -2
są specjalnymi wartościami dla czasu.
strftime(3)
nie obsługuje, %N
więc nie ma mowy o printf
drukowaniu nanosekund. Używam Ubuntu 14.04.
date
wydaje 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.
date
wielokrotnym uruchomieniem . W niektórych przypadkach data lub godzina mogą się zmieniać między uruchomieniami w miarę zapisywania polecenia. Lepiej uruchomić date
raz, 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 +%N
nie 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"})'
date
nie można go użyć i nie ma poleceń typu bash, które zaspokoją potrzebę.
date
nie 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
adjtimex
służy do odczytu (i ustawiania) zmiennych czasowych jądra. Dzięki awk
możesz uzyskać mikrosekundy, head
możesz użyć tylko pierwszych 3 cyfr.
Nie mam pojęcia, jak wiarygodne jest to polecenie.
Uwaga: bezwstydnie skradzione z tej odpowiedzi