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

时间:2010-09-07 07:48:12

标签: php time milliseconds

time()在几秒钟内 - 是否有一个毫秒?

12 个答案:

答案 0 :(得分:432)

简短回答是:

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

答案 1 :(得分:79)

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

答案 2 :(得分:38)

正如其他人所说,你可以使用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);
}

答案 3 :(得分:37)

简答:

仅限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并且对它们进行操作而不进行强制转换会导致函数返回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));
}

答案 4 :(得分:11)

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

答案 5 :(得分:8)

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

输出:

2016-11-19 15:12:34.346351

答案 6 :(得分:7)

试试这个:

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

答案 7 :(得分:5)

$timeparts = explode(" ",microtime());
$currenttime = bcadd(($timeparts[0]*1000),bcmul($timeparts[1],1000));
echo $currenttime;
  

注意:由于功能的改进,此功能需要PHP5   microtime()和bc数学模块也是必需的(因为我们正在处理   大数字,你可以检查你是否有phpinfo模块。

希望这对你有所帮助。

答案 8 :(得分:5)

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

答案 9 :(得分:5)

即使您使用的是32位PHP,也能正常工作:

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

请注意,这并不是整数,而是字符串。但是,这在许多情况下都可以正常工作,例如在为REST请求构建URL时。


如果需要整数,则必须使用64位PHP。

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

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

或者你可以使用好的&#39;单行:

{{1}}

答案 10 :(得分:0)

PHP 5.2.2 << / strong>

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

PHP 7.0.0 << / strong>

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

答案 11 :(得分:-2)

使用此:

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

再见