如何获得PHP中的当前时间(以毫秒为单位)?

time()以秒为单位 – 有毫秒吗?

简短的回答是:

 $milliseconds = round(microtime(true) * 1000); 

使用microtime() 。 这个函数返回一个由空格分隔的string。 第一部分是秒的小数部分,第二部分是整数部分。 通过true得到一个数字:

 var_dump(microtime()); // string(21) "0.89115400 1283846202" var_dump(microtime(true)); // float(1283846202.89) 

如果使用microtime(true)请小心精度损失。

还有gettimeofday()以整数forms返回微秒部分。

 var_dump(gettimeofday()); /* array(4) { ["sec"]=> int(1283846202) ["usec"]=> int(891199) ["minuteswest"]=> int(-60) ["dsttime"]=> int(1) } */ 

正如其他人所说,你可以使用microtime()来获得毫秒级的时间戳精度。

从您的意见,你似乎希望它作为一个高精度的UNIX时间戳。 类似于.NET世界中的DateTime.Now.Ticks

您可以使用以下function来做到这一点:

 function millitime() { $microtime = microtime(); $comps = explode(' ', $microtime); // Note: Using a string here to prevent loss of precision // in case of "overflow" (PHP converts it to a double) return sprintf('%d%03d', $comps[1], $comps[0] * 1000); } 

简短的回答:

只有64位平台!

 function milliseconds() { $mt = explode(' ', microtime()); return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000)); } 

很长的回答:

如果你想要以毫秒为单位的time()的平等函数,首先你必须考虑到,当time()返回从“纪元时间”(1970年1月1日)以来经过的秒数,自“时代”以来的毫秒数时间“是一个很大的数字,不适合32位整数。

PHP中整数的大小可以是32位或64位,具体取决于平台。

http://php.net/manual/en/language.types.integer.php

整数的大小是依赖于平台的,尽pipe最大值约为20亿是通常的值(这是32位的)。 除了总是32位的Windows外,64位平台的最大值通常约为9E18。 PHP不支持无符号整数。 整数大小可以使用常量PHP_INT_SIZE确定,最大值使用自PHP 4.4.0和PHP 5.0.5以来的常量PHP_INT_MAX。

如果你有64位整数,那么你可以使用下面的函数:

 function milliseconds() { $mt = explode(' ', microtime()); return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000)); } 

microtime()返回“epoch时间”以秒为单位的秒数,精度高达微秒,两个数字之间用空格隔开,如…

 0.90441300 1409263371 

第二个数字是小数部分前面的秒(整数)。

函数milliseconds以整数部分乘以1000

 1409263371000 

并将小数部分乘以1000并舍入为0小数

 1409263371904 

请注意, $mt[1]round的结果都被转换为int 。 这是必要的,因为它们是float并且对它们的操作没有转换就会导致函数返回一个float

最后,这个函数比一点精确

 round(microtime(true)*1000); 

比例为1:10(约)比正确的结果还多1毫秒。 这是由于floattypes的精度有限( microtime(true)返回一个float)。 无论如何,如果你仍然喜欢较短的round(microtime(true)*1000); 我会build议铸造int结果。


即使超出了问题范围,值得一提的是,如果您的平台支持64位整数,那么您也可以在几微秒内得到当前时间,而不会发生溢出。

如果事实2^63 (大约最大的有符号整数)除以10^6 * 3600 * 24 * 365 (大约在一年的微秒) 292471

这与echo PHP_INT_MAX / (1000000*3600*24*365);返回的值相同echo PHP_INT_MAX / (1000000*3600*24*365);

换句话说,一个有符号的整数可以存储超过20万年的时间,以微秒为单位。

那么你可能有

 function microseconds() { $mt = explode(' ', microtime()); return ((int)$mt[1]) * 1000000 + ((int)round($mt[0] * 1000000)); } 

在PHP 5中使用microtime(true) ,或在PHP 4中进行以下修改:

 array_sum(explode(' ', microtime())); 

编写该代码的便携方式是:

 function getMicrotime() { if (version_compare(PHP_VERSION, '5.0.0', '<')) { return array_sum(explode(' ', microtime())); } return microtime(true); } 
 $timeparts = explode(" ",microtime()); $currenttime = bcadd(($timeparts[0]*1000),bcmul($timeparts[1],1000)); echo $currenttime; 

注意:由于microtime()的改进和bcmath模块也是必需的(因为我们正在处理大量的数据,你可以检查你是否有phpinfo中的模块)。

希望这对你有所帮助。

尝试这个:

 public function getTimeToMicroseconds() { $t = microtime(true); $micro = sprintf("%06d", ($t - floor($t)) * 1000000); $d = new DateTime(date('Ymd H:i:s.' . $micro, $t)); return $d->format("Ymd H:i:su"); } 

echo date('Ymd H:i:s.') . gettimeofday()['usec'];

输出:

2016-11-19 15:12:34.346351

 $the_date_time = new DateTime($date_string); $the_date_time_in_ms = ($the_date_time->format('U') * 1000) + ($the_date_time->format('u') / 1000); 

即使您使用的是32位PHP,也可以这样做:

 list($msec, $sec) = explode(' ', microtime()); $time_milli = $sec.substr($msec, 2, 3); // '1491536422147' $time_micro = $sec.substr($msec, 2, 6); // '1491536422147300' 

注意这不会给你整数,而是string。 不过,在许多情况下,这种方法很好,比如在为REST请求build立URL时。

如果你需要整数,64位PHP是强制性的。

然后你可以重用上面的代码并转换为(int):

 list($msec, $sec) = explode(' ', microtime()); // these parentheses are mandatory otherwise the precedence is wrong! // ↓ ↓ $time_milli = (int) ($sec.substr($msec, 2, 3)); // 1491536422147 $time_micro = (int) ($sec.substr($msec, 2, 6)); // 1491536422147300 

或者你可以使用好的单线:

 $time_milli = (int) round(microtime(true) * 1000); // 1491536422147 $time_micro = (int) round(microtime(true) * 1000000); // 1491536422147300 

用这个:

 function get_millis(){ list($usec, $sec) = explode(' ', microtime()); return (int) ((int) $sec * 1000 + ((float) $usec * 1000)); } 

再见