这段代码总是在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)
小智 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)
jmc*_*tie 17
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)
\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)
是的,我想一劳永逸地解决这个问题.
解释如何以毫秒和微秒显示PHP 的ISO 8601格式日期和时间......
毫秒或'ms'在小数点后有4位数,例如0.1234.微秒或'μs'在小数点后有7位数.这里的秒数分数/名称解释
PHP的date()函数完全没有像预期的那样表现为毫秒或微秒,因为它只是一个整数,如格式字符'u'下的php date docs中所述.
基于Lucky的评论想法(这里),但修正了PHP语法并正确处理秒格式化(Lucky的代码在秒后添加了错误的额外'0')
这些也消除了竞争条件并正确地格式化了秒数.
工作当量 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
工作等效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
| 归档时间: |
|
| 查看次数: |
46989 次 |
| 最近记录: |