time()以秒为单位-是否以毫秒为单位?

#1 楼

简短的答案是:

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


评论


@FredrikWendt,我认为您对time()感到困惑。另一方面,microtime(true)以秒为单位返回自Unix纪元以来精确到最接近的微秒的当前时间(请参阅PHP参考)。如果您在循环中运行以上代码并显示毫秒,则实际上非常容易测试。

–劳伦特
2012-12-18在10:08



我喜欢简短的答案。

–埃里克·罗伯逊(Erick Robertson)
13-10-14在15:18

您应该只输入前13位数字,否则可能会获得〜90%的浮点数:substr(microtime(true)* 1000,0,13);

– StanE
2014年1月28日9:16



那不是microtime(true)/ 1000(除法而不是乘法)吗?

–乔丹·列夫
14年4月17日在19:07

@JordanLev,它应该是乘法,因为microtime(true)以秒为单位返回Unix时间戳(浮点数)。

–劳伦特
14年4月17日在21:07

#2 楼

使用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()等于1000 * time(),对吗?

– COMer
2010年9月7日于7:53

我看,可能有错误,但是错误应该小于1000,对吗?

– COMer
2010年9月7日于8:01

@COMer:您正在谈论哪个变体?

– kennytm
2010年9月7日在8:09

microtime(true)和1000 * time()

– COMer
2010年9月7日在8:11

@COMer:1000 * time()不会给您毫秒。 microtime(true)返回一个浮点数,其精度为14位。秒部分已经花费了10,因此微秒部分剩下了4位数字。这应该足够了,因为毫秒仅需要3个额外的数字。

– kennytm
2010年9月7日在8:17

#3 楼

简短答案:
仅适用于64位平台!
function milliseconds() {
    $mt = explode(' ', microtime());
    return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}

[如果运行的是64位PHP,则常数PHP_INT_SIZE等于8]

长答案:
如果要以毫秒为单位的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 ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}

microtime()返回自“纪元时间”以来的秒数,精确到微秒,两个数字之间用空格隔开,例如...
0.90441300 1409263371

第二个数字是
上面的函数milliseconds()将整数部分乘以1000
1409263371000

,然后将小数部分乘以1000并四舍五入。小数
1409263371904

请注意,$mt[1]round的结果都强制转换为int。这是必需的,因为它们是float s,并且对其进行不强制转换的操作将导致该函数返回float
最后,该函数比
round(microtime(true)*1000);

更精确比率为1:10(大约)的结果比正确结果多返回1毫秒。
这是由于float类型的精度有限(microtime(true)返回float)。
仍然更喜欢较短的round(microtime(true)*1000);,我建议将结果强制转换为int

即使超出了问题的范围,也值得一提的是,如果您的平台支持64位整数,那么您还可以获得当前时间
如果事实2^63 - 1(最大有符号整数)除以10^6 * 3600 * 24 * 365(一年中的大约微秒),则得出292471
与您获得的值相同
echo (int)( PHP_INT_MAX / ( 1000000 * 3600 * 24 * 365 ) );

换句话说,带符号的64位整数有空间存储超过200,000年的时间(以微秒为单位)。
然后,您可能拥有
function microseconds() {
    $mt = explode(' ', microtime());
    return ((int)$mt[1]) * 1000000 + ((int)round($mt[0] * 1000000));
}


评论


为什么不只是:`function getMilliEpoch(){$ mt = explode('',microtime());返回$ mt [1]。 substr($ mt [0],0,5)* 1000; }`

–迈克尔
17年5月14日在8:22



现在有一个用于微时间功能的参数,如果将其设置为true,则返回自1970年1月1日以来的秒数和毫秒数,以float表示的0小时0分钟0秒。这是一个示例:microtime(true)// 1553260455.7242

–kukko
19 Mar 22 '19 at 13:17

@kukko是的,但是由于float类型的精度有限,因此根据microtime(true)计算千分位数会导致数值略有不准确

–保罗
19 Mar 23 '19在10:27



#4 楼

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


评论


这就是这样做的方式!

– tonix
2014年12月29日15:27

perrrrrrfect ..♥。

–SRB禁令
18年2月1日在6:30

它不是返回服务器时间吗?以我为例,我看到在db中存储的时间是我的本地浏览器时间。假设我的服务器时区是EST + 3,浏览器时间是GMT + 6,当我从GMT + 6位置提交表单时,我看到存储的时间是GMT + 6时间等效毫秒。那么,有什么问题呢? :(

– Zenith
18-09-16在14:04

这是完美的解决方案

– Mohamed Elleuch
20-11-5在21:33

#5 楼

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


#6 楼

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

输出:

2016-11-19 15:12:34.346351

评论


这使用相同的时间戳:$ t = gettimeofday(); echo date('Y-m-d H:i:s。',$ t ['sec'])。 $ t ['usec'];

– Savvas Radevic
17-10-2在10:04



微秒应补零:$ timeofday = gettimeofday();回声sprintf(“%s。%06d”,date('Y-m-d H:i:s',$ timeofday ['sec']),$ timeofday ['usec']);

–马比
20-05-20在5:26

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


#8 楼

即使您使用的是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


或者您可以使用优质的单行代码:

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


#9 楼

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



注意:由于
microtime()的改进,该功能需要PHP5,并且还需要bc数学模块(因为我们正在处理
大量,则可以检查phpinfo中是否包含该模块。)


希望对您有所帮助。

#10 楼

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


评论


这真的像在右边填充三个零吗?

–Zeeshan
15年8月12日在4:20

一点也不。它将两个部分都转换为毫秒并给出总和。因此,它比加零更准确。

–user3767296
15年8月13日在5:53

尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。也请尽量不要在代码中加入解释性注释,这会降低代码和解释的可读性!

–麦恰(MichałPerłakowski)
16年5月5日在20:11

#11 楼

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 


评论


在php <7.1中,新的DateTime()微秒始终为0,请参阅php.net/manual/en/migration71.incompatible.php。

–马比
20-5-20在5:36

#12 楼

使用此:

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


再见