PHP DateTime微秒始终返回0

eyd*_*ber 70 php datetime

这段代码总是在PHP 5.2.5中返回0微秒:

<?php
$dt = new DateTime();
echo $dt->format("Y-m-d\TH:i:s.u") . "\n";
?>
Run Code Online (Sandbox Code Playgroud)

输出:

[root@www1 ~]$ php date_test.php
2008-10-03T20:31:26.000000
[root@www1 ~]$ php date_test.php
2008-10-03T20:31:27.000000
[root@www1 ~]$ php date_test.php
2008-10-03T20:31:27.000000
[root@www1 ~]$ php date_test.php
2008-10-03T20:31:28.000000
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

eyd*_*ber 26

这似乎有效,虽然http://us.php.net/date记录微秒说明符并不真正支持它似乎不合逻辑:

function getTimestamp()
{
        return date("Y-m-d\TH:i:s") . substr((string)microtime(), 1, 8);
}
Run Code Online (Sandbox Code Playgroud)

  • try:list($ usec,$ sec)= explode("",microtime()); 返回日期(日期("​​Ymd\TH:i:s",$ sec).$ usec; (29认同)
  • 通过单独调用,您有两个时间戳无序的可能性很小:例如,呼叫日期为1:29:22.999999,mircotime为1:29:23.000001.在我的服务器上,连续呼叫大约相隔10个. (16认同)

小智 19

您可以在构造DateTime对象时指定输入包含微秒,并microtime(true)直接用作输入.

不幸的是,如果你达到精确.的秒数,这将失败,因为微量时间输出中没有; 所以在这种情况下使用sprintf强制它包含一个.0:

date_create_from_format(
    'U.u', sprintf('%.f', microtime(true))
)->format('Y-m-d\TH:i:s.uO');
Run Code Online (Sandbox Code Playgroud)

或者等效(更多OO风格)

DateTime::createFromFormat(
    'U.u', sprintf('%.f', microtime(true))
)->format('Y-m-d\TH:i:s.uO');
Run Code Online (Sandbox Code Playgroud)

  • 如果`microtime(true)`命中一整秒--`date_create_from_format('U.u',sprintf('%.f',microtime(true))) - >格式(...` (2认同)

jmc*_*tie 17

此功能来自http://us3.php.net/date

function udate($format, $utimestamp = null)
{
    if (is_null($utimestamp))
        $utimestamp = microtime(true);

    $timestamp = floor($utimestamp);
    $milliseconds = round(($utimestamp - $timestamp) * 1000000);

    return date(preg_replace('`(?<!\\\\)u`', $milliseconds, $format), $timestamp);
}

echo udate('H:i:s.u'); // 19:40:56.78128
Run Code Online (Sandbox Code Playgroud)

非常棘手,你必须实现这个功能让"你"工作...:\


dbw*_*tek 14

试试这个,它显示微秒:

$t = microtime(true);
$micro = sprintf("%06d",($t - floor($t)) * 1000000);
$d = new DateTime( date('Y-m-d H:i:s.'.$micro,$t) );

print $d->format("Y-m-d H:i:s.u");
Run Code Online (Sandbox Code Playgroud)


Rya*_*yan 8

\DateTime::createFromFormat('U.u', microtime(true));
Run Code Online (Sandbox Code Playgroud)

会给你(至少在大多数系统上):

object(DateTime)(
  'date' => '2015-03-09 17:27:39.456200',
  'timezone_type' => 3,
  'timezone' => 'Australia/Darwin'
)
Run Code Online (Sandbox Code Playgroud)

但由于PHP浮动舍入,精度会下降.这不是真正的微秒.

更新

这可能是createFromFormat()选项的最佳折衷方案,并提供全面的精度.

\DateTime::createFromFormat('0.u00 U', microtime());
Run Code Online (Sandbox Code Playgroud)

函数gettimeofday()

更明确,也许更健壮.解决了Xavi发现的bug.

$time = gettimeofday(); 
\DateTime::createFromFormat('U.u', sprintf('%d.%06d', $time['sec'], $time['usec']));
Run Code Online (Sandbox Code Playgroud)


hoz*_*zza 5

是的,我想一劳永逸地解决这个问题.

解释如何以毫秒微秒显示PHP 的ISO 8601格式日期和时间......

毫秒或'ms'在小数点后有4位数,例如0.1234.微秒或'μs'在小数点后有7位数.这里的秒数分数/名称解释

PHP的date()函数完全没有像预期的那样表现为毫秒或微秒,因为它只是一个整数,如格式字符'u'下的php date docs中所述.

基于Lucky的评论想法(这里),但修正了PHP语法并正确处理秒格式化(Lucky的代码在秒后添加了错误的额外'0')

这些也消除了竞争条件并正确地格式化了秒数.

PHP日期以毫秒为单位

工作当量 date('Y-m-d H:i:s').".$milliseconds";

list($sec, $usec) = explode('.', microtime(true));
echo date('Y-m-d H:i:s.', $sec) . $usec;
Run Code Online (Sandbox Code Playgroud)

输出= 2016-07-12 16:27:08.5675

PHP日期与

工作等效date('Y-m-d H:i:s').".$microseconds";date('Y-m-d H:i:s.u')如果日期函数表现为预期的微秒/ microtime()/'u'

list($usec, $sec) = explode(' ', microtime());
echo date('Y-m-d H:i:s', $sec) . substr($usec, 1);
Run Code Online (Sandbox Code Playgroud)

输出= 2016-07-12 16:27:08.56752900

  • 很好的答案,但实际上一毫秒是小数点后 3 位,微秒是 6 位,并且在真正的 ISO 8601 格式中,这两个在技术上都不是有效的。 (2认同)