Jawaban:
date +%s
akan mengembalikan jumlah detik sejak zaman.
date +%s%N
mengembalikan detik dan nanodetik saat ini.
date +%s%N | cut -b1-13
akan memberi Anda jumlah milidetik sejak zaman - detik saat ini ditambah tiga nanodetik.
dan dari MikeyB - echo $(($(date +%s%N)/1000000))(membaginya dengan 1000 hanya membawa ke microseconds)
echo $(($(date +%s%N)/1000))
Anda cukup menggunakan %3Nuntuk memotong nanodetik ke 3 digit paling signifikan (yang kemudian menjadi milidetik):
$ date +%s%3N
1397392146866
Ini berfungsi misalnya pada kubuntu saya 12,04.
Namun ketahuilah, itu %Nmungkin tidak diterapkan tergantung pada sistem target Anda. Misalnya diuji pada sistem tertanam (rootro buildroot, dikompilasi menggunakan toolchain lintas lengan non-HF) tidak ada %N:
$ date +%s%3N
1397392146%3N
(Dan juga tablet Android saya (yang tidak di-rooting) tidak memiliki %N).
1397392146%3Nuntuk 1397392146%N, tetapi output 1397392146%3Nadalah bahwa apa yang saya benar-benar akan terlihat pada konsol busybox tablet android saya. Bisakah Anda menjelaskan hasil edit Anda?
date +%s.%3Ncetakan 1510718281.134.
date +%N tidak berfungsi pada OS X, tetapi Anda dapat menggunakannya
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
Bagi orang yang menyarankan menjalankan program eksternal untuk mendapatkan mili detik ... pada tingkat itu, Anda sebaiknya melakukan ini:
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
Poinnya adalah: sebelum memilih jawaban apa pun dari sini, harap diingat bahwa tidak semua program akan berjalan dalam satu detik penuh. Mengukur!
datemembutuhkan 3 ms untuk dijalankan.
solusi ini berfungsi pada macOS.
jika Anda mempertimbangkan untuk menggunakan skrip bash dan memiliki python tersedia, Anda bisa menggunakan kode ini:
#!/bin/bash
python -c 'from time import time; print int(round(time() * 1000))'
Jika Anda mencari cara untuk menampilkan berapa lama skrip Anda berjalan, yang berikut ini akan memberikan hasil (tidak sepenuhnya akurat):
Sedekat awal skrip Anda, masukkan yang berikut ini
basetime=$(date +%s%N)
Ini akan memberi Anda nilai awal dari sesuatu seperti 1361802943996000000
Di akhir skrip Anda, gunakan yang berikut ini
echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"
yang akan menampilkan sesuatu seperti
runtime: 12.383 seconds
Catatan:
(1 * 10 ^ 09) dapat diganti dengan 1000000000 jika diinginkan
"scale=3"adalah pengaturan yang agak jarang yang memaksa bcuntuk melakukan apa yang Anda inginkan. Masih banyak lagi!
Saya hanya menguji ini pada Win7 / MinGW ... Saya tidak memiliki kotak * nix yang tepat.
time <script>
Inilah cara mendapatkan waktu dalam milidetik tanpa melakukan pembagian. Mungkin lebih cepat ...
# test=`date +%s%N`
# testnum=${#test}
# echo ${test:0:$testnum-6}
1297327781715
Pembaruan: Alternatif lain dalam bash murni yang hanya berfungsi bash 4.2+sama dengan di atas tetapi digunakan printfuntuk mendapatkan tanggal. Ini pasti akan lebih cepat karena tidak ada proses yang dihapus dari yang utama.
printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}
Tangkapan lain di sini adalah bahwa strftimeimplementasi Anda harus mendukung %sdan %Nyang BUKAN terjadi pada mesin uji saya. Lihat man strftimeopsi yang didukung. Lihat juga man bashuntuk melihat printfsintaks. -1dan -2merupakan nilai khusus untuk waktu.
strftime(3)tidak mendukung %Njadi tidak ada cara untuk printfmencetak nanodetik. Saya menggunakan Ubuntu 14.04.
datesepertinya pilihan yang lebih bisa diandalkan.
Stempel waktu paling akurat yang bisa kita dapatkan (setidaknya untuk Mac OS X) mungkin ini:
python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'
1490665305.021699
Tetapi kita harus ingat bahwa dibutuhkan sekitar 30 milidetik untuk berjalan. Kita dapat memotongnya menjadi skala fraksi 2 digit, dan pada mulanya menghitung rata - rata overhead membaca waktu, dan kemudian menghapusnya dari pengukuran. Berikut ini sebuah contoh:
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`"
Anda dapat menghapus komentar perintah gema untuk melihat lebih baik cara kerjanya.
Hasil untuk skrip ini biasanya adalah salah satu dari 3 hasil ini:
measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01
Menggunakan tanggal dan expr dapat membawa Anda ke sana yaitu
X=$(expr \`date +%H\` \\* 3600 + \`date +%M\` \\* 60 + \`date +%S\`)
echo $X
Perluas untuk melakukan apa pun yang Anda inginkan
Saya menyadari ini tidak memberikan milidetik sejak zaman, tetapi mungkin masih berguna sebagai jawaban untuk beberapa kasus, itu semua tergantung pada apa yang Anda butuhkan, kalikan dengan 1000 jika Anda memerlukan nomor milidetik: D
Cara paling sederhana adalah dengan membuat executable kecil (dari C f.ex.) dan membuatnya tersedia untuk skrip.
datebeberapa kali. Dalam beberapa kasus, tanggal atau waktu dapat berubah antar berjalan saat perintah Anda ditulis. Lebih baik dijalankan datesekali dan parsing bagian-bagian keluar dan lakukan perhitungan Anda. Salah satu dari beberapa cara untuk melakukannya adalah t=$(date +%H%M%S); (( x = ${t:0:2} * 3600 + ${t:2:2} * 60 + ${t:4:2} )); echo "$x". Ini menggunakan sintaks Bash karena pertanyaannya ditandai bash . Seperti yang Anda singgung, jawaban Anda (dan variasi saya) hanya memberikan detik untuk hari ini sejauh ini dan bukan sejak Zaman dan bukan dalam milis.
(ulangi dari atas) date +%Ntidak berfungsi pada OS X, tetapi Anda juga dapat menggunakan:
Perl (membutuhkan modul Time :: Format). Mungkin bukan modul CPAN terbaik untuk digunakan tetapi menyelesaikan pekerjaan. Waktu :: Format umumnya tersedia dengan distribusi.
perl -w -e'use Time::Format; printf STDOUT ("%s.%s\n", time, $time{"mmm"})'
datetidak dapat digunakan dan tidak ada perintah bash-only yang menjawab kebutuhan.
datetidak dapat digunakan sebagai bagian dari jawaban Anda , saya akan menghapus downvote saya.
Menyatukan semua respons sebelumnya, saat berada di OSX
ProductName: Mac OS X
ProductVersion: 10.11.6
BuildVersion: 15G31+
Anda bisa suka
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"
}
Jika Anda menginginkan perhitungan shell yang sederhana, ini mudah dan portabel, menggunakan jawaban di atas:
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
Untuk alpine linux (banyak gambar buruh pelabuhan) dan mungkin lingkungan linux minimal lainnya, Anda dapat menyalahgunakan adjtimex:
adjtimex | awk '/(time.tv_usec):/ { printf("%06d\n", $2) }' | head -c3
adjtimexdigunakan untuk membaca (dan mengatur) variabel waktu kernel. Dengan awkAnda bisa mendapatkan mikrodetik, dengan headAnda dapat menggunakan 3 digit pertama saja.
Saya tidak tahu seberapa andal perintah ini.
Catatan: Tanpa malu-malu dicuri dari jawaban ini