php - DateInterval 不接受以毫秒为单位的 ISO 8601 时间段

标签 php dateinterval

我有这个 ISO 8601 时间段字符串: P0Y0M0DT3H5M0.000S
并且 PHP7.4 无法用它构造 DateInterval。

<?php
$d = new \DateInterval('P0Y0M0DT3H5M0.000S');
var_dump($d);

Fatal error: Uncaught Exception: DateInterval::__construct(): Unknown or bad format (P0Y0M0DT3H5M1.33S) in [...][...]:2



它失败了几毫秒。当我省略毫秒 -P0Y0M0DT3H5M0S- 它工作正常。

以毫秒为单位,它应该是一个有效的 ISO 8601 字符串 afaik。
根据维基百科,这是格式:

[Start]P[JY][MM][WW][TD][T[hH][mM][s[.f]S]]
https://de.wikipedia.org/wiki/ISO_8601#Zeitspannen



为什么 PHP 不接受这种格式,我该如何解决这个问题?

最佳答案

您可以使用DateInterval::createFromDateString .

$d = DateInterval::createFromDateString('3 Hours 5 Minutes 500000 microseconds');

echo $d->format('%h Hours %m Minutes %s.%F Seconds');
//3 Hours 0 Minutes 0.500000 Seconds

如果指定了 P0Y0M0DT3H5M7.520S 之类的表达式,则可以使用以下函数作为解决方法。
function createDateInterval($interval_spec){
  $f = 0.0;
  if(preg_match('~\.\d+~',$interval_spec,$match)){
    $interval_spec = str_replace($match[0], "", $interval_spec);
    $f = (float)$match[0];
  }
  $di = new \Dateinterval($interval_spec);
  $di->f= $f;
  return $di;
}

$d = createDateInterval('P0Y0M0DT3H5M7.520S');
echo '<pre>';
var_export($d);

结果:
DateInterval::__set_state(array(
   'y' => 0,
   'm' => 0,
   'd' => 0,
   'h' => 3,
   'i' => 5,
   's' => 7,
   'f' => 0.52,
   'weekday' => 0,
   'weekday_behavior' => 0,
   'first_last_day_of' => 0,
   'invert' => 0,
   'days' => false,
   'special_type' => 0,
   'special_amount' => 0,
   'have_weekday_relative' => 0,
   'have_special_relative' => 0,
)) 

关于php - DateInterval 不接受以毫秒为单位的 ISO 8601 时间段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60435670/

相关文章:

PHP 登录应用程序 - 创建新用户时检查用户名是否已存在

php - 添加新的 XML 标记代码(PHP、HTML)

php - 有没有办法在php中实现多重继承?

swift - 将 DateInterval 保存到 Realm 的正确方法

php - 如何在PHP中获得两个日期之间的月份差异

MYSQL 添加工作日至今

php - 将 DateInterval 格式化为 ISO8601

php - 我如何修复此循环以使用 bootstrap carousel 显示我的数据库中的图像

php - 在 PHP 中正确快速地进行 TELNET 的方法。套接字或 curl