Aneh bahwa pertanyaan tersebut meminta konversi milidetik , tetapi semua orang menjawab cara mengonversi mikrodetik. Saya tahu Anda dapat mengonversi di antara keduanya tetapi benar-benar menjawab pertanyaan alih-alih menyalin dan menempelkan kode yang tidak terkait dari dokumen PHP atau di tempat lain akan menyenangkan.
laurent
Saya tahu sudah lama, tetapi jawaban bamossza adalah yang terbaik yang saya temukan di sini
Microseconds (ditambahkan dalam PHP 5.2.2). Perhatikan bahwa itu date()akan selalu menghasilkan 000000karena dibutuhkan parameter integer, sedangkan DateTime::format()mendukung mikrodetik jika DateTimedibuat dengan mikrodetik.
Saya biasanya memilih bentuk kedua karena lebih mudah dibaca dan dipahami. Selain itu, DateTime jauh lebih fleksibel dan kuat daripada fungsi tanggal / waktu. Menangani mikrodetik adalah kasus yang tepat.
Herbert
3
@ Geo dan AlBundy mungkinkah Anda mencoba ini pada mesin dengan php <5.2.2? PHP 5.4.39 berjalan dengan baik ...
RichardBernards
bukankah ini mudah? tanggal ('mdY H: i: s'). (int) waktu mikro (benar);
Anant
@Anant, itu akan sangat mudah, memang. Tapi salah. ;) Apa yang Anda dapatkan di sana hanya dalam hitungan detik. (Sayangnya, tidak akan berhasil microtime(false).)
Sz.
Kode ini tidak bekerja di semua lokal dengan benar. Beberapa negara seperti Jerman menulis "0,1234" atau "0.1234" bukan ".1234", oleh karena itu kode Anda memberikan keluaran berikut untuk saya: 2012-07-08 11:14:15.0.889342
Daniel Marschall
138
Anda dapat dengan mudah melakukan ini dengan format input U.u.
Terima kasih untuk cekikikan karena menunjukkan cacat dalam jawaban asli saya, menambahkan number_format()baris harus memperbaiki kasus detik yang tepat. Sayang sekali rasanya tidak seanggun lagi ...
Namun, teknik yang dijelaskan di sini adalah menginisialisasi objek DateTime microtime()yang mengembalikan jumlah detik yang telah berlalu sejak Unix Epoch (01 Jan 1970 00:00:00 GMT).
Ini berarti bahwa objek DateTime secara implisit diinisialisasi ke UTC, yang baik untuk tugas internal server yang hanya ingin melacak waktu yang telah berlalu.
Jika Anda perlu menampilkan waktu untuk zona waktu tertentu, maka Anda perlu mengaturnya. Namun, ini harus dilakukan sebagai langkah terpisah setelah inisialisasi ( tidak menggunakan parameter ketiga createFromFormat()) karena alasan yang dibahas di atas.
The setTimeZone()metode dapat digunakan untuk mencapai persyaratan ini.
Catatan: DateTime::createFromFormat('U.u', microtime(true));akan mengembalikan nilai salah jika microtime(true)dijalankan tepat pada detik. Ini mengembalikan '1438616239' bukan '1438616239.000000'.
giggsey
1
Solusi hebat, terima kasih. Sepertinya saya kehilangan waktu lokal saya membuat $ sekarang dari microtime. Ada ide?
daVe
1
@daVe Saya telah menambahkan beberapa informasi tentang zona waktu, saya harap itulah yang Anda cari.
ArchCodeMonkey
1
Itu number_formatselalu diperlukan, bahkan saat itu tidak tepat pada detik. Jika tidak, Anda bergantung pada precisionopsi konfigurasi PHP (untuk "tampilan"), yang tidak cukup tinggi secara default pada PHP 7.0 yang menyebabkan hilangnya presisi (tidak akurat hingga mikrodetik).
Teoh Han Hui
1
Selalu gulir ke bawah di StackOverflow
tom10271
15
Berikut pendekatan yang sedikit lebih pendek. Daripada bekerja untuk membuat tanggal / waktu numerik presisi tinggi, saya mengonversi nilai mikrodetik menjadi string, menghapus 0, dan menambahkannya ke akhir string tanggal / waktu. Saya dapat dengan mudah memangkas jumlah desimal dengan menyesuaikan parameter panjang string; di sini saya gunakan 4untuk mendapatkan milidetik, tetapi Anda bisa menggunakannya 7untuk mendapatkan mikrodetik.
Jika Anda memiliki kebutuhan untuk membatasi jumlah tempat desimal maka baris di bawah ini (mgutt kredit) akan menjadi alternatif yang baik. (Dengan kode di bawah ini, angka 6 membatasi jumlah tempat desimal menjadi 6.)
Anda melewatkan presisi dan nol di depan untuk detik. Jadi versi yang benar seharusnya echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));. Penjelasan mengapa kita membutuhkan 09: stackoverflow.com/a/28739819/318765
mgutt
Anda melewatkan presisi lagi;)echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
mgutt
Tapi hati-hati, substr()tidak bulat. Dan jika digabungkan dengan round()itu akan memotong angka nol yang tertinggal: stackoverflow.com/questions/7493305/… Itulah alasan mengapa saya mengusulkan sprintf().
mgutt
@mgutt Kapan digit pertama tidak menjadi nol? Pada dasarnya yang dibutuhkan hanyalah menghilangkan nol yang selalu ada ketika mendapatkan sisa dari fmod sebesar 1. Pertanyaan menanyakan mikrodetik tetapi dalam bentuk tempat desimal dari detik. Tidak ada alasan untuk membatasi jumlah tempat desimal. Lebih banyak tempat desimal berarti presisi yang lebih baik.
ghbarratt
@mgutt Saya menambahkan alternatif pertama Anda yang disarankan ke jawaban saya, menjelaskan bahwa itu akan menjadi cara yang baik untuk membatasi jumlah tempat desimal jika diperlukan
ghbarratt
3
Jika Anda ingin memformat tanggal seperti JavaScript (new Date()).toISOString()karena alasan tertentu, berikut cara melakukannya di PHP:
Tidak. Jangan gunakan matematika pada bilangan floating point, itu tidak akurat. Juga jangan buang waktu untuk memanggil beberapa fungsi. Cukup gunakan substr () untuk memotong tanggal yang diformat menjadi tiga tempat desimal.
LS
@LS Memotong tidak akan membulatkan desimal ke-3 yang mungkin bahkan lebih tidak akurat. Float tidak akan rusak sampai Anda mendapatkan presisi yang sangat kecil; 3 tempat desimal sudah cukup. Sebenarnya, saya rasa saya tidak mengubah presisi sama sekali, float menjadi lebih akurat semakin Anda mendekati 0. Mengurangkan bilangan bulat tidak akan mengubah tempat desimal AFAIK.
mpen
Tentang apa date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));?
F8ER
@ F8ER Jika Anda $timesudah dalam milidetik, ya, secara teknis itu akan berhasil. Jangan suka substrhacknya, tapi saya rasa ini akan berhasil untuk tanggal antara 2001 dan 2286.
mpen
Ya, $timeitu MS, tapi bagaimana dengan 2286, maksud saya mengapa berpikir begitu dan bagaimana mungkin untuk menghindarinya?
F8ER
3
Ini berdasarkan jawaban dari ArchCodeMonkey.
Tetapi hanya disederhanakan, jika Anda hanya menginginkan sesuatu yang cepat dan berfungsi.
Microseconds (ditambahkan dalam PHP 5.2.2). Perhatikan bahwa date () akan selalu menghasilkan 000000 karena ini mengambil parameter integer, sedangkan DateTime :: format () mendukung mikrodetik.
Ya sesuai jawaban di atas (dan percobaan saya) new DateTime()juga akan mengembalikan 0000 untuk Anda. Tetapi jika Anda memberikan waktu akurasi mikrodetik saat membuat instance, itu berfungsi dengan baik.
scipilot
@scipilot ok, jadi bagaimana Anda melakukannya?
Geo
@ Geo melihat jawaban yang diterima. new DateTime( 'Y-m-d H:i:s.'.$micro);
scipilot
0
Dengan PHP 7.0+ sekarang di sini Anda dapat melakukan hal berikut:
Memangkas 4 angka nol terakhir dari string sehingga Date()dapat menangani tanggal.
Menggunakan tanggal untuk memformat milidetik menjadi string waktu tanggal yang dapat dipahami DateTime.
DateTime()kemudian dapat memungkinkan Anda untuk mengubah zona waktu tempat Anda berada, tetapi pastikan itu date_default_timezone_set("Timezone");disetel sebelum Anda menggunakan DateTime()fungsi dan kelas.
Merupakan praktik yang baik untuk menggunakan konstruktor di kelas Anda untuk memastikan Anda berada dalam zona waktu yang benar saat DateTime()kelas atau fungsi digunakan.
Jawaban:
php.net mengatakan:
Jadi gunakan sesederhana itu:
Direkomendasikan dan gunakan
dateTime()
kelas dari referensi:Catatan
u
adalah mikrodetik (1 detik = 1000000 µs).Contoh lain dari php.net :
Referensi
dateTime()
di php.netSaya telah menjawab pertanyaan secara singkat dan mempermudah penulis. Silakan lihat untuk informasi lebih lanjut kepada penulis: mendapatkan format tanggal mdY H: i: su dari milidetik
sumber
microtime(false)
.)2012-07-08 11:14:15.0.889342
Anda dapat dengan mudah melakukan ini dengan format input
U.u
.Ini menghasilkan keluaran berikut:
Dari halaman manual PHP untuk format tanggal:
http://php.net/manual/en/function.date.php
Terima kasih untuk cekikikan karena menunjukkan cacat dalam jawaban asli saya, menambahkan
number_format()
baris harus memperbaiki kasus detik yang tepat. Sayang sekali rasanya tidak seanggun lagi ...http://php.net/manual/en/function.number-format.php
Catatan tentang zona waktu sebagai tanggapan atas DaVe.
Biasanya
createFromFormat()
metode ini akan menggunakan zona waktu lokal jika tidak ditentukan.http://php.net/manual/en/datetime.createfromformat.php
Namun, teknik yang dijelaskan di sini adalah menginisialisasi objek DateTime
microtime()
yang mengembalikan jumlah detik yang telah berlalu sejak Unix Epoch (01 Jan 1970 00:00:00 GMT).http://php.net/manual/en/function.microtime.php
Ini berarti bahwa objek DateTime secara implisit diinisialisasi ke UTC, yang baik untuk tugas internal server yang hanya ingin melacak waktu yang telah berlalu.
Jika Anda perlu menampilkan waktu untuk zona waktu tertentu, maka Anda perlu mengaturnya. Namun, ini harus dilakukan sebagai langkah terpisah setelah inisialisasi ( tidak menggunakan parameter ketiga
createFromFormat()
) karena alasan yang dibahas di atas.The
setTimeZone()
metode dapat digunakan untuk mencapai persyaratan ini.http://php.net/manual/en/datetime.settimezone.php
Sebagai contoh:
Menghasilkan keluaran sebagai berikut:
Perhatikan bahwa jika Anda ingin memasukkan mysql, format waktu harus:
sumber
DateTime::createFromFormat('U.u', microtime(true));
akan mengembalikan nilai salah jikamicrotime(true)
dijalankan tepat pada detik. Ini mengembalikan '1438616239' bukan '1438616239.000000'.number_format
selalu diperlukan, bahkan saat itu tidak tepat pada detik. Jika tidak, Anda bergantung padaprecision
opsi konfigurasi PHP (untuk "tampilan"), yang tidak cukup tinggi secara default pada PHP 7.0 yang menyebabkan hilangnya presisi (tidak akurat hingga mikrodetik).Berikut pendekatan yang sedikit lebih pendek. Daripada bekerja untuk membuat tanggal / waktu numerik presisi tinggi, saya mengonversi nilai mikrodetik menjadi string, menghapus
0
, dan menambahkannya ke akhir string tanggal / waktu. Saya dapat dengan mudah memangkas jumlah desimal dengan menyesuaikan parameter panjang string; di sini saya gunakan4
untuk mendapatkan milidetik, tetapi Anda bisa menggunakannya7
untuk mendapatkan mikrodetik.Untuk nilai microtime ()
0.98236000 1407400573
, ini mengembalikan08-07-14 01:08:13.982
.sumber
Saya menggunakan
sumber
contoh keluaran:
Jika Anda memiliki kebutuhan untuk membatasi jumlah tempat desimal maka baris di bawah ini (mgutt kredit) akan menjadi alternatif yang baik. (Dengan kode di bawah ini, angka 6 membatasi jumlah tempat desimal menjadi 6.)
contoh keluaran:
sumber
echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));
. Penjelasan mengapa kita membutuhkan09
: stackoverflow.com/a/28739819/318765echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
substr()
tidak bulat. Dan jika digabungkan denganround()
itu akan memotong angka nol yang tertinggal: stackoverflow.com/questions/7493305/… Itulah alasan mengapa saya mengusulkansprintf()
.Jika Anda ingin memformat tanggal seperti JavaScript
(new Date()).toISOString()
karena alasan tertentu, berikut cara melakukannya di PHP:Output sampel:
Hanya untuk membuktikan bahwa mengurangi bilangan bulat tidak mengurangi keakuratan bagian desimal:
PHP melakukan pembulatan tempat desimal, tetapi membulatkannya dengan cara yang sama dalam kedua kasus.
sumber
date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));
?$time
sudah dalam milidetik, ya, secara teknis itu akan berhasil. Jangan sukasubstr
hacknya, tapi saya rasa ini akan berhasil untuk tanggal antara 2001 dan 2286.$time
itu MS, tapi bagaimana dengan2286
, maksud saya mengapa berpikir begitu dan bagaimana mungkin untuk menghindarinya?Ini berdasarkan jawaban dari ArchCodeMonkey.
Tetapi hanya disederhanakan, jika Anda hanya menginginkan sesuatu yang cepat dan berfungsi.
Jadi bagi saya
sumber
Berikut metode lain yang menurut saya sedikit lebih elegan / sederhana:
sumber
sumber
Pada PHP 7.1 Anda cukup melakukan ini:
Ini akan ditampilkan sebagai:
sumber
Dokumentasinya mengatakan yang berikut:
Yaitu, gunakan DateTime sebagai gantinya.
sumber
new DateTime()
juga akan mengembalikan 0000 untuk Anda. Tetapi jika Anda memberikan waktu akurasi mikrodetik saat membuat instance, itu berfungsi dengan baik.new DateTime( 'Y-m-d H:i:s.'.$micro);
Dengan PHP 7.0+ sekarang di sini Anda dapat melakukan hal berikut:
Ini melakukan hal berikut secara berurutan:
Date()
dapat menangani tanggal.DateTime()
kemudian dapat memungkinkan Anda untuk mengubah zona waktu tempat Anda berada, tetapi pastikan itudate_default_timezone_set("Timezone");
disetel sebelum Anda menggunakanDateTime()
fungsi dan kelas.DateTime()
kelas atau fungsi digunakan.sumber
jika Anda menggunakan Karbon, Anda dapat menggunakan spesifikasi yang ditentukan "RFC3339_EXTENDED". atau sesuaikan.
sumber
Berdasarkan jawaban @ArchCodeMonkey.
Jika sudah,
declare(strict_types=1)
Anda harus melemparkan argumen kedua ke stringsumber
Saya mengambil beberapa cara berbeda:
1) microtime + sscanf + tanggal:
Saya tidak yakin mengapa microtime () mengembalikan 10 karakter (0.dddddd00) untuk bagian mikrodetik tetapi mungkin seseorang dapat memberi tahu saya?
2) format DateTime :: createFromFormat + Datetime->:
tidak berfungsi di PHP 5.x ...
3) gettimeofday + date:
-
4) microtime + number_format + DateTime :: createFromFormat + DateTime-> format:
-
5) microtime + sprintf + DateTime :: createFromFormat + DateTime-> format:
-
sumber