DateIntervalはミリ秒単位でISO 8601時間期間を受け入れません

ivoba :

私は、このISO 8601の時間文字列を持っている:P0Y0M0DT3H5M0.000S とPHP7.4はそれでDateIntervalを構築するために失敗しました。

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

致命的なエラー:捕捉されない例外:DateInterval :: __構築物():[...] [...]で不明または不正な形式(P0Y0M0DT3H5M1.33S):2

これは、ミリ秒で失敗しました。私はミリ秒を省略した場合、それは罰金を作品-P0Y0M0DT3H5M0S-。

ミリ秒単位で、それは有効なISO 8601の文字列私の知る限りでなければなりません。
ウィキペディアによれば、これは形式は次のとおりです。

[スタート] P [JY] [MM] [WW] [TD] [T [HH] [mm]の[S [.F] S]
https://de.wikipedia.org/wiki/ISO_8601#Zeitspannen

なぜdoesntのPHPにはこの形式を受け入れ、どのように私はこれを回避することができますか?

jspit:

あなたは使用することができます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,
)) 

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=15488&siteId=1