Pertanyaan Bagaimana cara mendapatkan waktu Unix saat ini dalam milidetik di bash?


Bagaimana cara mendapatkan waktu Unix saat ini dalam milidetik (mis. Jumlah milidetik sejak Unix epoch 1 Januari 1970)?


197
2018-06-14 16:04






Jawaban:


Ini:

date +%s 

akan mengembalikan jumlah detik sejak zaman itu.

Ini:

date +%s%N

mengembalikan detik dan nanodetik saat ini.

Begitu:

date +%s%N | cut -b1-13

akan memberi Anda jumlah milidetik sejak zaman - detik saat ini ditambah tiga nanodetik kiri.


dan dari MikeyB - echo $(($(date +%s%N)/1000000)) (Membagi dengan 1000 hanya membawa ke mikrodetik)


233
2018-06-14 16:10



Saya bertanya-tanya berapa banyak ms yang ditambahkan :-) - Kyle Brandt♦
Atau jika Anda ingin melakukan semuanya di shell, hindari overhead yang mahal dari proses tambahan (sebenarnya, kami menghindari masalah ketika jumlah digit dalam% + s + N berubah): echo $(($(date +%s%N)/1000)) - MikeyB
Ini adalah prinsip masalah ... hindari angka ajaib dan kode apa yang sebenarnya berarti. - MikeyB
Saya pikir perlu dicatat bahwa orang itu meminta Unix, bukan Linux, dan jawaban teratas saat ini (tanggal +% s% N) tidak berfungsi pada sistem AIX saya. - Pete
@Pete +1 Sama untuk OS X, dan FreeBSD - ocodo


Anda cukup menggunakan %3N untuk memotong nanodetik ke 3 digit paling signifikan (yang kemudian milidetik):

$ date +%s%3N
1397392146866

Ini berfungsi misalnya di kubuntu saya 12.04.

Namun perlu disadari, itu %N mungkin tidak diimplementasikan tergantung pada sistem target Anda. Misalnya. diuji pada sistem embedded (buildroot rootfs, dikompilasi menggunakan non-HF arm cross toolchain) tidak ada %N:

$ date +%s%3N
1397392146%3N

(Dan juga tablet Android saya (yang tidak di-root) tidak punya %N).


79
2018-04-13 12:34



@warren: Saya melihat bahwa Anda mengedit dan mengubah 1397392146%3N untuk 1397392146%N, tetapi output dari 1397392146%3N adalah apa yang benar-benar saya lihat di konsol busybox tablet android saya. Bisakah Anda menjelaskan suntingan Anda? - Joe
Komentar warren dari sejarah adalah "berubah dari 3 menjadi 6, karena 3 hanya membawa Anda ke mikrodetik". Suntingannya tampaknya sepenuhnya palsu; Anda harus gulung kembali. - bukzor
Ini adalah fitur inti GNU secara khusus. Pada akhirnya, ini diimplementasikan dalam gnulib di sini: github.com/gagern/gnulib/blob/…. - telotortium
mungkin sebuah titik di sana masuk akal. date +%s.%3N cetakan 1510718281.134. - darksky


date +%N tidak berfungsi di OS X, tetapi Anda bisa menggunakan salah satunya

  • rubi: ruby -e 'puts Time.now.to_f'
  • python: python -c 'import time; print time.time()'
  • node.js: node -e 'console.log(Date.now())'
  • PHP: php -r 'echo microtime(TRUE);'
  • internet: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
  • atau untuk milidetik dibulatkan ke detik terdekat date +%s000

51
2017-09-02 11:16



untuk kelengkapan ... node -e 'console.log(Date.now())' - slf
Menggunakan PHP: php -r 'echo microtime(TRUE);' - TachyonVortex
Tentu, Anda hanya perlu menunggu juru bahasa itu untuk pemanasan. Ini juga berfungsi: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N - Camilo Martin
Atau, jika Anda sebenarnya tidak membutuhkan milidetik tetapi hanya format yang benar: date +%s000 - Lenar Hoyt
apple.stackexchange.com/questions/135742/… memiliki petunjuk untuk melakukan ini di OSX melalui Brew coreutils - sameers


Hanya membuang ini di luar sana, tapi saya pikir formula yang tepat dengan pembagiannya adalah:

echo $(($(date +%s%N)/1000000))

8
2017-09-07 21:22





Solusi saya bukan yang terbaik tetapi berhasil untuk saya.

date +%s000

Saya hanya perlu mengonversi tanggal seperti 2012-05-05 hingga milidetik.


6
2018-05-09 20:11



Hack menakjubkan, lol :) - k06a
Anda harus menjadi seseorang di antara rekan kerja saya. - Nakilon


Untuk orang-orang yang menyarankan menjalankan program eksternal untuk mendapatkan milidetik ... pada tingkat itu, Anda mungkin juga melakukan ini:

wget -qO- http://www.timeapi.org/utc/now?\\s.\\N

Intinya adalah: sebelum mengambil jawaban dari sini, harap diingat bahwa tidak semua program akan berjalan di bawah satu detik. Mengukur!


6
2018-06-23 13:17



Anda tidak menanyakan sistem lokal untuk saat itu. Yang saya kira tersirat dalam pertanyaan itu. Anda juga bergantung pada koneksi jaringan. - orkoden
@orkoden Pertanyaan secara eksplisit meminta "jumlah milidetik sejak jaman Unix 1 Januari 1970". Juga, saya lebih menekankan bagaimana Anda seharusnya tidak menyalakan Ruby atau Python (atau wget) hanya untuk mendapatkan waktu - baik ini dilakukan melalui saluran cepat atau milidetik tidak masalah. - Camilo Martin
Ya, saya mengerti bahwa Anda memberi solusi yang lebih buruk untuk menyoroti kelemahan solusi buruk. Saya mencoba beberapa solusi dan mengukur waktu. lpaste.net/119499 Hasilnya agak menarik. Bahkan pada mesin i7 yang sangat cepat date membutuhkan 3 ms untuk dijalankan. - orkoden
@orkoden Pengujian yang bagus! OS apa? Ini mungkin harus dilakukan dengan proses pemijahan di atas kepala. - Camilo Martin
@Nakilon dan inilah mengapa orang tidak boleh bergantung pada kenyamanan yang bisa dikekang seperti itu untuk produksi apa pun. - Camilo Martin


solusi ini berfungsi di macOS.

jika Anda mempertimbangkan menggunakan skrip bash dan memiliki python yang tersedia, Anda bisa menggunakan kode ini:

#!/bin/bash

python -c 'from time import time; print int(round(time() * 1000))'

3
2018-02-05 14:26



mengapa suara turun? - Frank Thonig
Tidak tampak sangat dibenarkan. Petunjuk pada panah bawah mengatakan "Jawaban ini tidak berguna", tetapi IMO itu berguna. Mungkin mereka ingin Anda menjadikannya skrip Python sebagai gantinya. Itu akan lebih sederhana dan juga berfungsi dengan baik sebagai perintah bash. - Andrew Schulman
Jangan terlalu khawatir tentang downvotes (itu bukan milikku) ... terutama jika mereka anonim (dari mana orang tidak bisa belajar apa yang keliru, kan?). Hanya untuk hlep Anda memprosesnya ... ini dia +1 lagi ... coba tebak: ANDA juga diizinkan untuk "memilih" sekarang, kan? - Pierre.Vriens
Downvote tampaknya disebabkan oleh masalah dengan sistem. Sejak itu telah dihapus, lagi oleh sistem. - Michael Hampton♦


Jika Anda mencari cara untuk menampilkan lamanya waktu skrip Anda berjalan, berikut ini akan memberikan hasil (tidak sepenuhnya akurat):

Saat mendekati awal skrip Anda yang Anda bisa, 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 Anda mau

"scale=3" adalah pengaturan yang agak langka yang memaksa bc untuk melakukan apa yang kamu inginkan. Masih banyak lagi!

Saya hanya menguji ini di Win7 / MinGW ... Saya tidak punya kotak * nix yang tepat untuk ditangan.


2
2018-02-25 14:48



atau Anda bisa menggunakannya time <script> - warren


Berikut adalah 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 dengan bash 4.2+ sama seperti di atas tetapi gunakan printf untuk mendapatkan tanggalnya. Ini pasti akan lebih cepat karena tidak ada proses yang bercabang dari yang utama.

printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}

Tangkapan lain di sini adalah bahwa Anda strftime implementasi harus mendukung %s dan %N yang BUKAN terjadi pada mesin uji saya. Lihat man strftime untuk opsi yang didukung. Juga lihat man bashuntuk melihat printf sintaksis. -1 dan -2 adalah nilai-nilai khusus untuk waktu.


2
2018-02-10 09:05



Sepertinya saya strftime(3) tidak mendukung %N jadi tidak mungkin printf untuk mencetak nanodetik. Saya menggunakan Ubuntu 14.04. - haridsv
@haridsv, ya, itu tidak dalam glibc. date sepertinya pilihan yang lebih andal. - akostadinov


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

Namun perlu diingat bahwa dibutuhkan sekitar 30 milidetik untuk dijalankan. Kita dapat memotongnya ke skala 2 digit fraksi, dan pada awal menghitung overhead rata-rata membaca waktu, dan kemudian menghapusnya dari pengukuran. Berikut ini contohnya:

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 perintah echo untuk melihat lebih baik cara kerjanya.

Hasil untuk skrip ini biasanya salah satu dari 3 hasil ini:

measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01

2
2018-03-28 02:13