Добавление одной микросекунды к объекту Datetime в стеке переполнения

Мне нужно добавить микросекунду к объекту Datetime в PHP. Я пытаюсь сделать это, добавляя интервал времени в доли секунды к 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');

Я не могу этого сделать, хотя думаю, что это должно быть просто. Как я могу добавить доли секунды в Datetime?

10

Решение

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

Внимание: это не для .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 или более ранняя версия, вы можете извлечь микросекунды и выполнить математику самостоятельно «хакерским» способом:

$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

$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
9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]