DateInterval 不接受以毫秒为单位的 ISO 8601 时间段
DateInterval doesn't accept ISO 8601 timeperiod with milliseconds
我有这个 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,
))
我有这个 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,
))