【问题标题】:Adding one microsecond to Datetime object in PHP在 PHP 中向 Datetime 对象添加一微秒
【发布时间】:2018-06-06 12:41:40
【问题描述】:

我需要在 PHP 中的 Datetime 对象中添加一微秒。我正在尝试将时间间隔添加到 Datetime 的几分之一秒,但它不起作用。

$date = new Datetime('2018-06-05 09:06:46.7487');
$date->add(new DateInterval('PT0.00001S'));
echo $date->format('Y-m-d H:i:s.u');

虽然我认为它应该很简单,但我无法完成它。如何将秒的分数添加到日期时间?

【问题讨论】:

标签: php datetime php-7.0


【解决方案1】:

PHP >= 7.1 - 有效,但有一个错误!

如果您有 PHP 7.1 或更高版本,那么应该这样做:

$date = new Datetime('2018-06-05 09:06:46.7487');
$date->modify('+1 microsecond');
echo $date->format('Y-m-d H:i:s.u');

输出:

2018-06-05 09:06:46.748701

Caution: this fails for .999999

$date = new Datetime('2018-06-05 09:06:46.999999');
$date->modify('+1 microsecond');
echo $date->format('Y-m-d H:i:s.u');

输出:

2018-06-05 09:06:46.1000000

所有 PHP 版本“破解”但没有错误!

如果您有 PHP 7.0 或更早版本,那么您可以提取微秒并以“hacky”方式自己执行数学运算:

$date = new Datetime('2018-06-05 09:06:46.7487');

// Use bcadd() to add .000001 seconds to the "microtime()" of the date
$microtime = bcadd( $date->getTimestamp().'.'.$date->format( 'u' ), '.000001', 6 );

// Reconstruct the date for consumption by __construct
$date->__construct(
    date( 'Y-m-d H:i:s.', explode( '.', $microtime )[ 0 ] ).explode( '.', $microtime )[ 1 ]
);

echo $date->format('Y-m-d H:i:s.u');

输出:

2018-06-05 09:06:46.748701

如果微秒为.999999,hacky 解决方案也有效

$date = new Datetime('2018-06-05 09:06:46.999999');

// Use bcadd() to add .000001 seconds to the "microtime()" of the date
$microtime = bcadd( $date->getTimestamp().'.'.$date->format( 'u' ), '.000001', 6 );

// Reconstruct the date for consumption by __construct
$date->__construct(
    date( 'Y-m-d H:i:s.', explode( '.', $microtime )[ 0 ] ).explode( '.', $microtime )[ 1 ]
);

echo $date->format('Y-m-d H:i:s.u');

输出:

2018-06-05 09:06:47.000000

【讨论】:

  • 虽然代码很优雅,但这会增加 10 微秒,并且如果时间晚于 x.999998 将不起作用
  • @symcbean 我认为+1 microsecond.999999 相比有问题,请参阅我的编辑。
  • 请注意,此错误已在 PHP 7.2 中修复。
猜你喜欢
  • 2017-02-02
  • 2019-06-19
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多