当前位置:  开发笔记 > 编程语言 > 正文

PHP DateTime微秒始终返回0

如何解决《PHPDateTime微秒始终返回0》经验,为你挑选了6个好方法。

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

format("Y-m-d\TH:i:s.u") . "\n";
?>

输出:

[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

有任何想法吗?



1> eydelber..:

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

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


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

2> 小智..:

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

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

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

或者等效(更多OO风格)

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


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

3> jmccartie..:

此功能来自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('`(?

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



4> dbwebtek..:

试试这个,它显示微秒:

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



5> Ryan..:
\DateTime::createFromFormat('U.u', microtime(true));

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

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

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

更新

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

\DateTime::createFromFormat('0.u00 U', microtime());

函数gettimeofday()

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

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



6> hozza..:

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

解释如何以毫秒微秒显示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;

输出= 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);

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

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有