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 %3N
untuk 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 %N
mungkin 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%3N
untuk 1397392146%N
, tetapi output 1397392146%3N
adalah bahwa apa yang saya benar-benar akan terlihat pada konsol busybox tablet android saya. Bisakah Anda menjelaskan hasil edit Anda?
date +%s.%3N
cetakan 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.\\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
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!
date
membutuhkan 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 bc
untuk 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 printf
untuk 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 strftime
implementasi Anda harus mendukung %s
dan %N
yang BUKAN terjadi pada mesin uji saya. Lihat man strftime
opsi yang didukung. Lihat juga man bash
untuk melihat printf
sintaks. -1
dan -2
merupakan nilai khusus untuk waktu.
strftime(3)
tidak mendukung %N
jadi tidak ada cara untuk printf
mencetak nanodetik. Saya menggunakan Ubuntu 14.04.
date
sepertinya 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.
date
beberapa kali. Dalam beberapa kasus, tanggal atau waktu dapat berubah antar berjalan saat perintah Anda ditulis. Lebih baik dijalankan date
sekali 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 +%N
tidak 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"})'
date
tidak dapat digunakan dan tidak ada perintah bash-only yang menjawab kebutuhan.
date
tidak 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
adjtimex
digunakan untuk membaca (dan mengatur) variabel waktu kernel. Dengan awk
Anda bisa mendapatkan mikrodetik, dengan head
Anda dapat menggunakan 3 digit pertama saja.
Saya tidak tahu seberapa andal perintah ini.
Catatan: Tanpa malu-malu dicuri dari jawaban ini