time()
dalam hitungan detik - apakah ada satu dalam milidetik?
php
time
milliseconds
Pendatang
sumber
sumber
time()
.microtime(true)
di sisi lain mengembalikan waktu saat ini dalam detik sejak zaman Unix akurat ke mikrodetik terdekat (lihat referensi PHP). Sebenarnya sangat mudah untuk menguji jika Anda menjalankan kode di atas dalam satu lingkaran dan menampilkan milidetik.microtime(true) / 1000
(pembagian bukan mulitplication)?Gunakan
microtime
. Fungsi ini mengembalikan string yang dipisahkan oleh spasi. Bagian pertama adalah bagian pecahan detik, bagian kedua adalah bagian integral. Lulustrue
untuk mendapat nomor:Waspadalah terhadap kehilangan presisi jika Anda menggunakannya
microtime(true)
.Ada juga
gettimeofday
yang mengembalikan bagian mikrodetik sebagai bilangan bulat.sumber
microtime()
sama dengan1000*time()
, kan?1000
, kan?microtime(true)
dan1000*time()
1000*time()
tidak akan memberi Anda milidetik.microtime(true)
mengembalikanfloat
yang memiliki 14 digit presisi. Bagian detik sudah mengambil 10, sehingga tersisa 4 digit untuk bagian mikrodetik. Ini harus cukup karena milidetik hanya membutuhkan 3 digit tambahan.Jawaban singkat:
Platform 64 bit saja!
[ Jika Anda menjalankan PHP 64 bit maka konstanta
PHP_INT_SIZE
sama dengan8
]Jawaban panjang:
Jika Anda ingin fungsi kesetimbangan
time()
dalam milidetik pertama, Anda harus mempertimbangkan bahwa sebagaitime()
mengembalikan jumlah detik yang berlalu sejak "zaman" (01/01/1970), jumlah milidetik sejak "zaman" adalah angka besar dan tidak masuk ke dalam integer 32 bit.Ukuran integer di PHP bisa 32 atau 64 bit tergantung platform.
Dari http://php.net/manual/en/language.types.integer.php
Jika Anda memiliki bilangan bulat 64 bit maka Anda dapat menggunakan fungsi berikut:
microtime()
mengembalikan jumlah detik sejak "zaman" dengan presisi hingga mikrodetik dengan dua angka yang dipisahkan oleh ruang, seperti ...Angka kedua adalah detik (bilangan bulat) sedangkan yang pertama adalah bagian desimal.
Fungsi di atas
milliseconds()
mengambil bagian integer dikalikan dengan1000
kemudian menambahkan bagian desimal dikalikan
1000
dan dibulatkan menjadi 0 desimalPerhatikan bahwa keduanya
$mt[1]
dan hasilround
dilemparkan keint
. Ini perlu karena merekafloat
s dan operasi pada mereka tanpa casting akan menghasilkan fungsi mengembalikan afloat
.Akhirnya, fungsi itu sedikit lebih tepat daripada
bahwa dengan rasio 1:10 (perkiraan) mengembalikan 1 milidetik lebih dari hasil yang benar. Hal ini disebabkan oleh ketepatan terbatas dari tipe float (
microtime(true)
mengembalikan float). Pokoknya jika Anda masih lebih suka yang lebih pendekround(microtime(true)*1000);
saya sarankan casting untukint
hasilnya.Bahkan jika itu di luar ruang lingkup pertanyaan, perlu disebutkan bahwa jika platform Anda mendukung bilangan bulat 64 bit maka Anda juga bisa mendapatkan waktu saat ini dalam mikrodetik tanpa menimbulkan luapan.
Jika fakta
2^63 - 1
(integer bertanda tangan terbesar) dibagi dengan10^6 * 3600 * 24 * 365
(kira-kira mikrodetik dalam satu tahun) berikan292471
.Nilai yang sama dengan yang Anda dapatkan
Dengan kata lain, integer 64 bit yang ditandatangani memiliki ruang untuk menyimpan rentang waktu lebih dari 200.000 tahun yang diukur dalam mikrodetik.
Anda mungkin memilikinya
sumber
Seperti yang telah dinyatakan, Anda dapat menggunakan
microtime()
untuk mendapatkan ketepatan milidetik pada cap waktu.Dari komentar Anda, Anda sepertinya menginginkannya sebagai Timestamp UNIX presisi tinggi. Sesuatu seperti
DateTime.Now.Ticks
di dunia .NET.Anda dapat menggunakan fungsi berikut untuk melakukannya:
sumber
Gunakan
microtime(true)
di PHP 5, atau modifikasi berikut di PHP 4:Cara portabel untuk menulis kode itu adalah:
sumber
echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];
keluaran:
2016-11-19 15:12:34.346351
sumber
$t = gettimeofday(); echo date('Y-m-d H:i:s.',$t['sec']) . $t['usec'];
$timeofday=gettimeofday(); echo sprintf("%s.%06d", date('Y-m-d H:i:s', $timeofday['sec']), $timeofday['usec']);
coba ini:
sumber
Ini berfungsi bahkan jika Anda menggunakan PHP 32-bit:
Catatan ini tidak memberi Anda bilangan bulat, tetapi string. Namun ini berfungsi dengan baik dalam banyak kasus, misalnya ketika membangun URL untuk permintaan REST.
Jika Anda membutuhkan bilangan bulat, PHP 64-bit wajib diisi.
Kemudian Anda dapat menggunakan kembali kode di atas dan melemparkan ke (int):
Atau Anda dapat menggunakan one-liners ol yang baik:
sumber
Semoga ini bisa membantu Anda.
sumber
sumber
PHP 5.2.2 <
PHP 7.0.0 <7.1
sumber
Gunakan ini:
Sampai jumpa
sumber