PHP DateInterval 创建瞬间(微秒或毫秒)间隔

Jim*_*mix 3 php precision datetime intervals dateinterval

如何在 PHP 中创建瞬间 DateInterval?例如:

0.123456秒

DateInterval::__construct的interval_spec

没有F也不f类似于支持分秒的DateInterval::format 。

DateInterval::createFromDateString相对格式列表也没有提及秒的任何分数。

DateInterval 类属性列表显示:

f 微秒数,以秒的一小部分形式表示。

我能够通过使用两个 DateTimes 的DateTime::diff瞬间获得 DateInterval

例子:

$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;
Run Code Online (Sandbox Code Playgroud)

给出:

Interval (yyyy-mm-dd hh:mm:ss.sfract): 00-00-00 00:00:00.123456
Run Code Online (Sandbox Code Playgroud)

因为 DateTime 在其构造函数中支持瞬间time_format并且DateTime::createFromFormat可以理解

u 微秒(最多六位数) 示例:45, 654321

顺便说一句:您不认为u使用 in case 和DateTimeFin fcase ofDateInterval可能会让您的一天变得不那么无聊吗?

我的解决方法之一可能是创建两个DateTime具有瞬间精度的值,然后diff获得DateInterval具有相同瞬间精度的值,但我希望仅使用 DateInterval 获得相同的结果。

你知道如何仅使用 the 来创造DateIntervalhaving吗?0.123456 secDateInterval

基于已接受答案的解决方案:

$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;
Run Code Online (Sandbox Code Playgroud)

给出:

Interval (dd hh:mm:ss.sfract): 01 02:03:01.123456
Run Code Online (Sandbox Code Playgroud)

Nic*_*ick 7

有一种方法可以使用以下方法来做到这一点DateInterval::createFromDateString

$di = DateInterval::createFromDateString('123456 microseconds');
var_dump($di);
Run Code Online (Sandbox Code Playgroud)

输出:

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)
}
Run Code Online (Sandbox Code Playgroud)

3v4l.org 上的演示

从手册中:

时间

带有相关部分的日期。具体来说,解析器支持的相对格式用于strtotime()DateTime将用于构造 DateInterval。