'Adding one microsecond to Datetime object in PHP

I need to add a microsecond to a Datetime object in PHP. I am trying to do it adding a time interfal a fraction of a second to the Datetime but it is not working.

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

I am not able to accomplish it though i think it should be simple. How can i add fractions of a second to a Datetime?



Solution 1:[1]

PHP >= 7.1 - works but there's a bug!

If you have PHP 7.1 or later then this should do it:

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

Output:

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');

Output:

2018-06-05 09:06:46.1000000

PHP >= 5.2.0 "hack" but not buggy!

If you have PHP 7.0 or earlier then you can extract the microseconds and perform the math yourself in a "hacky" way:

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

Output:

2018-06-05 09:06:46.748701

The hacky solution also works if the microsecond is at .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');

Output:

2018-06-05 09:06:47.000000

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1