time()
在几秒钟内 - 有一个毫秒?
简短的回答是:
$milliseconds = round(microtime(true) * 1000);
即使您使用的是32位PHP,这也可以正常工作:
list($msec, $sec) = explode(' ', microtime());
$time_milli = $sec.substr($msec, 2, 3); // '1491536422147'
$time_micro = $sec.substr($msec, 2, 6); // '1491536422147300'
请注意,这不会给你整数,而是字符串。但是,在许多情况下,这可以正常工作,例如在为REST请求构建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
或者你可以使用好的'one-liners:
$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));
}
再见
使用microtime
。此函数返回由空格分隔的字符串。第一部分是秒的小数部分,第二部分是整数部分。通过true
得到一个数字:
var_dump(microtime()); // string(21) "0.89115400 1283846202"
var_dump(microtime(true)); // float(1283846202.89)
如果你使用microtime(true)
,请注意精度损失。
还有gettimeofday
将微秒部分作为整数返回。
var_dump(gettimeofday());
/*
array(4) {
["sec"]=>
int(1283846202)
["usec"]=>
int(891199)
["minuteswest"]=>
int(-60)
["dsttime"]=>
int(1)
}
*/
正如其他人所说,你可以使用microtime()
在时间戳上获得毫秒精度。
从您的评论中,您似乎希望将其作为高精度UNIX时间戳。像.NET世界中的DateTime.Now.Ticks
。
您可以使用以下功能执行此操作:
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()
返回自“纪元时间”(01/01/1970)以来经过的秒数,自“纪元时间”以来的毫秒数是大数,不适合32位整数。
PHP中整数的大小可以是32位或64位,具体取决于平台。
来自http://php.net/manual/en/language.types.integer.php
整数的大小取决于平台,尽管最大值约为20亿是通常的值(32位有符号)。 64位平台的最大值通常约为9E18,Windows除外,它总是32位。 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()
返回自“纪元时间”以来的秒数,精确到微秒,两个数字用空格分隔,如...
0.90441300 1409263371
第二个数字是小数部分前面的秒(整数)。
函数milliseconds
取整数部分乘以1000
1409263371000
并添加小数部分乘以1000
并舍入为0小数
1409263371904
请注意,$mt[1]
和round
的结果都被铸造到int
。这是必要的,因为它们是float
s并且对它们的操作没有强制转换会导致函数返回float
。
最后,该功能稍微精确一些
round(microtime(true)*1000);
比率为1:10(大约)的值比正确结果多1毫秒。这是由于浮点类型的精度有限(microtime(true)
返回浮点数)。无论如何,如果你仍然喜欢较短的round(microtime(true)*1000);
我建议铸造到int
的结果。
即使它超出了问题的范围,值得一提的是,如果您的平台支持64位整数,那么您也可以在几微秒内获得当前时间而不会产生溢出。
如果事实2^63
(约为最大有符号整数)除以10^6 * 3600 * 24 * 365
(大约一年内的微秒)给出约。 292471
。
这与echo PHP_INT_MAX / (1000000*3600*24*365);
返回的值相同
换句话说,有符号整数有空间存储超过200000年的时间跨度,以微秒为单位。
那你可能有
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);
}
echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];
输出:
2016-11-19 15:12:34.346351
试试这个:
public function getTimeToMicroseconds() {
$t = microtime(true);
$micro = sprintf("%06d", ($t - floor($t)) * 1000000);
$d = new DateTime(date('Y-m-d H:i:s.' . $micro, $t));
return $d->format("Y-m-d H:i:s.u");
}
$timeparts = explode(" ",microtime());
$currenttime = bcadd(($timeparts[0]*1000),bcmul($timeparts[1],1000));
echo $currenttime;
注意:由于microtime()的改进,这个函数需要PHP5,并且还需要bc数学模块(因为我们处理大数字,你可以检查你是否在phpinfo中有模块)。
希望这对你有所帮助。
$the_date_time = new DateTime($date_string);
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) +
($the_date_time->format('u') / 1000);