PHP 裡頭印出 Y-m-d h:i:s.u 的日期時間(有 ms)的方式很多,過年前無聊試了一下,還真的有些不一樣
想到的三種方式如下
- 用 DateTime::createFromFormat 並指定 format U.u (一般產生DateTime只會到 second)
- 用gettimeofday()拿['usec']
- 用microtime(true)並用字串處理的方式
分別 looping 1000*10 次
<?php echo (microtime(true)); echo "<br>new DateTime with U.u then format<br>"; for ($i = 0; $i < 1000*10; $i++) { $t = DateTime::createFromFormat("U.u",microtime(true)); $t->format("Y-m-d H:i:s.u"); } echo (microtime(true)); echo "<br><br>new DateTime, with gettimeofday()['usec']<br>"; for ($i = 0; $i < 1000*10; $i++) { $t = (new DateTime())->format("Y-m-d H:i:s.") . gettimeofday()['usec']; } echo (microtime(true)); echo "<br><br>explode microtime, then date() and sprintf<br>"; for ($i = 0; $i < 1000*10; $i++) { list($usec, $sec) = explode(" ", microtime()); $milli = floor(((float) $usec) * 1000); $ts = date("Y M d H:i:s", (float) $sec) . "." . sprintf("%03d", $milli); } echo (microtime(true)); ?>
結果如下:
1644158152.6933 new DateTime with U.u then format 1644158152.7722 new DateTime, with gettimeofday()['usec'] 1644158152.9082 explode microtime, then date() and sprintf 1644158152.9817
結論是用 用microtime(true)並用字串處理的方式 的速度最快, DateTime::createFromFormat 小輸一點點