PHP DateInterval создать интервал в доли секунды (микросекунды или милисекунды) - PullRequest
3 голосов
/ 02 февраля 2020

Как создать доли секунды DateInterval в PHP? Например:

0.123456 se c

?

interval_spe c из DateInterval :: __ construct

не имеет F и f аналогично DateInterval :: format , который поддерживает разделенные секунды.

Относительный список форматов из DateInterval :: createFromDateString также не упоминает о какой-либо дробной части c.

Но в списке свойств класса DateInterval показано:

f Количество микросекунд в долях секунды.

Мне удалось получить DateInterval за доли секунды, используя DateTime :: diff двух DateTimes с разделенными секундами

пример:

$formatStr = 'Y-m-d H:i:s.u';
$dateTimeStr = '2000-01-01 00:00:00.0';
$timeZone = new \DateTimeZone('UTC'); 
$timerDateTimeStart = \DateTimeImmutable::createFromFormat($formatStr, $dateTimeStr, $timeZone);

$formatStr = 'Y-m-d H:i:s.u';
$dateTimeStr = '2000-01-01 00:00:00.123456';
$timeZone = new \DateTimeZone('UTC');
$timerDateTimeEnd = \DateTimeImmutable::createFromFormat($formatStr, $dateTimeStr, $timeZone);

$timerDiff = $timerDateTimeStart->diff($timerDateTimeEnd);
$intervalStr = $timerDiff->format('%Y-%M-%D %H:%I:%S.%f');
echo 'Interval (yyyy-mm-dd hh:mm:ss.sfract): ' . $intervalStr;

дает:

Interval (yyyy-mm-dd hh:mm:ss.sfract): 00-00-00 00:00:00.123456

, поскольку DateTime поддерживает долю секунды time_format в своем конструкторе и DateTime: : createFromFormat понимает

u Микросекунды (до шести цифр) Пример: 45, 654321

Кстати: не думаете ли вы, что u в случае работы с DateTime и F или f в случае DateInterval может сделать ваш день немного менее скучным?

Одним из моих решений может быть создание двух DateTime с точностью до доли секунды, а затем diff, чтобы получить DateInterval с той же точностью до доли секунды, но я хотел бы получить тот же результат с только DateInterval.

Знаете ли вы, как создать DateInterval с 0.123456 sec, используя только DateInterval?

Решение на основе принятого ответа:

$dateInterval = DateInterval::createFromDateString("1 day, 2 hours, 3 minutes, 1 second, 123456 microsecond");
$intervalStr = $dateInterval->format('%D %H:%I:%S.%F');
echo 'Interval (dd hh:mm:ss.sfract): ' . $intervalStr . PHP_EOL;

дает:

Interval (dd hh:mm:ss.sfract): 01 02:03:01.123456

1 Ответ

3 голосов
/ 02 февраля 2020

Есть способ сделать это, используя DateInterval::createFromDateString:

$di = DateInterval::createFromDateString('123456 microseconds');
var_dump($di);

Вывод:

object(DateInterval)#1 (16) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(0)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["f"]=>
  float(0.123456)
  ["weekday"]=>
  int(0)
  ["weekday_behavior"]=>
  int(0)
  ["first_last_day_of"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  bool(false)
  ["special_type"]=>
  int(0)
  ["special_amount"]=>
  int(0)
  ["have_weekday_relative"]=>
  int(0)
  ["have_special_relative"]=>
  int(0)
}

Демонстрация на 3v4l.org

Из руководства:

время

Дата с относительными частями. В частности, форматы относительно , поддерживаемые синтаксическим анализатором, используемым для strtotime() и DateTime, будут использоваться для создания DateInterval.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...