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

time()是以秒为单位的——有一个是以毫秒为单位的吗?

517646 次浏览

使用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);
}

在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);
}

简短的回答是:

$milliseconds = floor(microtime(true) * 1000);
< p >用这个: < PRE > <代码> <代码>函数get_millis () { List ($usec, $sec) =爆炸(' ',microtime()); 返回(int) ((int) $sec * 1000 + ((float) $usec * 1000)); 代码代码}< / > < / > < / PRE > < / p >

再见

简短的回答:

仅限64位平台!

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

[__abc2]


长一点的回答:

如果你想要一个以毫秒为单位的等价函数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 4.4.0和PHP 5.0.5开始,可以使用常量PHP_INT_SIZE确定整数大小,使用常量PHP_INT_MAX确定最大值。

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

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

microtime()返回从“纪元时间”开始的秒数。精度可达微秒,两个数字之间用空格隔开,比如……

0.90441300 1409263371

第二个数字是秒数(整数),第一个数字是小数部分。

上面的函数milliseconds()取整数部分乘以1000

1409263371000

然后将小数部分乘以1000并四舍五入为0小数

1409263371904

注意,$mt[1]round的结果都通过intval()转换为int。这是必要的,因为它们是float,对它们进行不强制转换的操作将导致函数返回精度损失的float

最后,该函数比

round(microtime(true)*1000);

,以1:10的比例(大约)返回比正确结果多1毫秒。 这是由于浮点类型的精度有限(microtime(true)返回浮点数)。 无论如何,如果你仍然喜欢更短的round(microtime(true)*1000);,我建议将结果转换为int


即使它超出了问题的范围,值得一提的是,如果你的平台支持64位整数,那么你也可以以微秒为单位获取当前时间而不会引起溢出。

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

这和你得到的值是一样的

echo intdiv( PHP_INT_MAX, 1E6 * 3600 * 24 * 365 );

换句话说,一个有符号的64位整数有空间存储超过20万年的时间跨度(以微秒计)。

那你就可以

function microseconds() {
$mt = explode(' ', microtime());
return intval( $mt[1] * 1E6 ) + intval( round( $mt[0] * 1E6 ) );
}
$timeparts = explode(" ",microtime());
$currenttime = bcadd(($timeparts[0]*1000),bcmul($timeparts[1],1000));
echo $currenttime;
注意:这个函数需要PHP5,因为与 Microtime()和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);

试试这个:

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");
}

echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];

输出:

2016-11-19 15:12:34.346351

即使你使用的是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时。

< p > < br > 如果你需要整数,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

PHP 5.2.2 <

$d = new DateTime();
echo $d->format("Y-m-d H:i:s.u"); // u : Microseconds

PHP 7.0.0 <7.1

$d = new DateTime();
echo $d->format("Y-m-d H:i:s.v"); // v : Milliseconds

这是我的实现,应该工作在32位以及。

function mstime(){
$mstime = explode(' ',microtime());
return $mstime[1].''.(int)($mstime[0]*1000);
}

字符串变体的最短版本(32位兼容):

$milliseconds = date_create()->format('Uv');

如果你想看到真正的微秒,你需要将php.ini中的precision设置更改为16。

之后,microsecond(true)给了我1631882476.298437的输出。

所以我认为我需要用1000 余数(298437),但事实上,余数是0.298437 一秒钟。因此,我需要通过1000来获得正确的结果。

    function get_milliseconds()
{
$timestamp = microtime(true);
return (int)(($timestamp - (int)$timestamp) * 1000);
}

我个人使用这个:

public static function formatMicrotimestamp(DateTimeInterface $dateTime): int
{
return (int) substr($dateTime->format('Uu'), 0, 13);
}