Apakah ada perintah shell di Linux untuk mendapatkan waktu dalam milidetik?
date -Ins
Apakah ada perintah shell di Linux untuk mendapatkan waktu dalam milidetik?
date -Ins
Jawaban:
date +%s%N
mengembalikan jumlah detik + nanodetik saat ini.
Karena itu, echo $(($(date +%s%N)/1000000))
itulah yang Anda butuhkan.
Contoh:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
mengembalikan jumlah detik sejak zaman, jika itu berguna.
%N
tidak didukung olehdate
date +%s%3N
lebih cepat (berdasarkan jawaban @ michael-defort)
coreutils
menggunakan MacPorts atau Homebrew - kemudian gunakan gdate
perintah. Lihat pertanyaan ini: stackoverflow.com/questions/9804966/…
date +"%T.%N"
mengembalikan waktu saat ini dengan nanodetik.
06:46:41.431857000
date +"%T.%6N"
mengembalikan waktu saat ini dengan nanodetik dibulatkan ke 6 digit pertama, yaitu mikrodetik.
06:47:07.183172
date +"%T.%3N"
mengembalikan waktu saat ini dengan nanodetik dibulatkan ke 3 digit pertama, yaitu milidetik.
06:47:42.773
Secara umum, setiap bidang dalam date
format perintah dapat diberikan lebar bidang opsional.
%xN
: bagus untuk lebar bidang!
Nano adalah 10 −9 dan mili 10 −3 . Oleh karena itu, kita dapat menggunakan tiga karakter pertama nanodetik untuk mendapatkan milidetik:
date +%s%3N
Dari man date
:
% N nanodetik (000000000..999999999)
% s detik sejak 1970-01-01 00:00:00 UTC
Sumber: Kesalahan Server Bagaimana saya mendapatkan waktu Unix saat ini dalam milidetik di Bash? .
Pada OS X, di mana date
tidak mendukung %N
flag, saya sarankan menginstal coreutils
menggunakan Homebrew . Ini akan memberi Anda akses ke perintah yang disebut gdate
yang akan berperilaku seperti date
halnya pada sistem Linux.
brew install coreutils
Untuk pengalaman yang lebih "asli", Anda selalu dapat menambahkan ini ke .bash_aliases
:
alias date='gdate'
Kemudian jalankan
$ date +%s%N
Berikut ini adalah hack portabel untuk Linux untuk mendapatkan waktu dalam milidetik:
#!/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
Outputnya adalah:
3010
Ini adalah operasi yang sangat murah, yang bekerja dengan internal shell dan procfs.
date
perintah tidak menyediakan mili detik pada OS X, jadi gunakan alias dari python
millis(){ python -c "import time; print(int(time.time()*1000))"; }
ATAU
alias millis='python -c "import time; print(int(time.time()*1000))"'
fork()
menghapus proses yang terpisah, exec
edit juru bahasa Python Anda, biarkan ia memuat perpustakaannya / inisialisasi, tulis hasilnya, dan keluar, hasilnya tidak akan lagi akurat.
Jawaban lain mungkin cukup dalam banyak kasus, tetapi saya pikir saya akan menambahkan dua sen saya ketika saya mengalami masalah pada sistem BusyBox .
Sistem yang dipermasalahkan tidak mendukung %N
opsi format dan tidak memiliki interpreter Python atau Perl.
Setelah banyak yang menggaruk kepala, kami (terima kasih Dave!) Datang dengan ini:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Ini mengekstrak detik dan mikrodetik dari output adjtimex
(biasanya digunakan untuk mengatur opsi untuk jam sistem) dan mencetaknya tanpa garis baru (sehingga mereka direkatkan). Perhatikan bahwa bidang mikrodetik harus diisi sebelumnya dengan nol, tetapi ini tidak memengaruhi bidang detik yang lebih panjang dari enam digit. Dari sini harus sepele untuk mengubah mikrodetik menjadi milidetik.
Jika Anda memerlukan garis baru yang tertinggal (mungkin karena terlihat lebih baik) maka cobalah
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
Perhatikan juga bahwa ini memerlukan adjtimex
dan awk
tersedia. Jika tidak maka dengan BusyBox Anda dapat mengarahkannya secara lokal dengan:
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
Dan kemudian sebut di atas sebagai
./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Atau tentu saja Anda bisa memasukkannya ke dalam PATH
EDIT:
Di atas berfungsi pada perangkat BusyBox saya. Di Ubuntu saya mencoba hal yang sama dan menyadari bahwa adjtimex
ada versi yang berbeda. Di Ubuntu ini berfungsi untuk menghasilkan waktu dalam detik dengan tempat desimal ke mikrodetik (termasuk garis baru yang tertinggal)
sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
Saya tidak akan melakukan ini di Ubuntu. Saya akan menggunakandate +%s%N
Perl dapat digunakan untuk ini, bahkan pada platform eksotis seperti AIX. Contoh:
#!/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;
Skrip Python seperti ini:
import time
cur_time = int(time.time()*1000)
time.time()
mengembalikan float ke 6 tempat desimal, setidaknya pada MacOS.
Saya hanya ingin menambahkan ke jawaban Alper apa yang harus saya lakukan untuk menyelesaikan pekerjaan ini:
Di Mac, Anda perlu brew install coreutils
, jadi kami bisa menggunakannya gdate
. Kalau tidak di Linux, hanya saja date
. Dan fungsi ini akan membantu Anda mengatur waktu tanpa harus membuat file sementara atau apa pun:
function timeit() {
start=`gdate +%s%N`
bash -c $1
end=`gdate +%s%N`
runtime=$(((end-start)/1000000000.0))
echo " seconds"
}
Dan Anda dapat menggunakannya dengan string:
timeit 'tsc --noEmit'
function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Ketika Anda menggunakan GNU AWK sejak versi 4.1, Anda dapat memuat pustaka waktu dan melakukan:
$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'
Ini akan mencetak waktu saat ini dalam detik sejak 1970-01-01T00: 00: 00 dalam akurasi sub detik.
the_time = gettimeofday()
Kembalikan waktu dalam detik yang telah berlalu sejak 1970-01-01 UTC sebagai nilai titik-mengambang. Jika waktu tidak tersedia di platform ini, kembali-1
dan aturERRNO
. Waktu yang dikembalikan harus memiliki ketepatan sub-detik , tetapi ketepatan sebenarnya dapat bervariasi berdasarkan pada platform. Jikagettimeofday()
panggilan sistem C standar tersedia di platform ini, maka itu hanya mengembalikan nilai. Kalau tidak, jika pada MS-Windows, ia mencoba menggunakannyaGetSystemTimeAsFileTime()
.Sumber: GNU awk panduan
Pada sistem Linux, fungsi C standar getimeofday()
mengembalikan waktu dalam akurasi mikrodetik.
Untuk menampilkan tanggal dengan waktu dan zona waktu
tanggal + "% d-% m-% Y% T.% N% Z"
Output: 22-04-2020 18: 01: 35.970289239 IST
date +%s.%N
akan memberi Anda nanodetik, dapatkah Anda bekerja dengan itu?