2015-06-18 46 views
-2

所以基本上我有一個我想用ISO8601格式表示的秒數值。PHP - 將整數秒數轉換爲ISO8601格式

例如:

作爲T1M30S

到目前爲止我也做了以下90秒將表示:

$length = 90; 
$interval = DateInterval::createFromDateString($length . ' seconds'); 
echo($interval->format('TH%hM%iS%s')); 

這種情況的輸出是:

TH0M0S90


端起來建設這個功能,這似乎產生我所需要的值(然而限於持續時間是不到一天的時間:

public function DurationISO8601(){ 

     $lengthInSeconds = $this->Length; 
     $formattedTime = 'T'; 

     $units = array(
      'H' => 3600, 
      'M' => 60, 
      'S' => 1 
     ); 

     foreach($units as $key => $unit){ 
      if($lengthInSeconds >= $unit){ 
       $value = floor($lengthInSeconds/$unit); 
       $lengthInSeconds -= $value * $unit; 
       $formattedTime .= $value . $key; 
      } 
     } 

     return $formattedTime; 
    } 

感謝

+2

那麼你的問題是什麼?在你說「我該怎麼做?」之前,請記住,那樣的問題太廣泛了,並且會像這樣封閉。所以,如果您迄今爲止編寫了任何代碼,我強烈建議將其添加到您的問題中。你應該閱讀「[我怎麼問一個好問題?](http://stackoverflow.com/help/how-to-ask)」。 –

+0

通過60分鐘得到分鐘數並將結果顯示出來,使用'%'操作符獲得秒數,將其與字符串操作位合併在一起... – deceze

+0

更新的問題... @deceze如果if你有超過60分鐘呢? –

回答

3

這裏是什麼似乎是一個ISO8601持續時間字符串生成器。它有一堆醜陋的垃圾,可以根據持續時間範圍以及處理零秒時間間隔從P對T開始。

function iso8601_duration($seconds) 
{ 
    $intervals = array('D' => 60*60*24, 'H' => 60*60, 'M' => 60, 'S' => 1); 

    $pt = 'P'; 
    $result = ''; 
    foreach ($intervals as $tag => $divisor) 
    { 
    $qty = floor($seconds/$divisor); 
    if (!$qty && $result == '') 
    { 
     $pt = 'T'; 
     continue; 
    } 

    $seconds -= $qty * $divisor;  
    $result .= "$qty$tag"; 
    } 
    if ($result=='') 
    $result='0S'; 
    return "$pt$result"; 
} 

的測試碼的位以驅動圍繞所述塊的所述功能幾次:

從測試碼
$testranges = array(1, 60*60*24-1, 60*60*24*2, 60*60*24*60); 
foreach ($testranges as $endval) 
{ 
    $seconds = mt_rand(0,$endval); 
    echo "ISO8601 duration test<br>\n"; 
    echo "Random seconds: " . $seconds . "s<br>\n"; 

    $duration = iso8601_duration($seconds); 
    echo "Duration: $duration<br>\n"; 
    echo "<br>\n"; 
} 

輸出類似於此:

ISO8601 duration test 
Random seconds: 0s 
Duration: T0S 

ISO8601 duration test 
Random seconds: 3064s 
Duration: T51M4S 

ISO8601 duration test 
Random seconds: 19872s 
Duration: T5H31M12S 

ISO8601 duration test 
Random seconds: 4226835s 
Duration: P48D22H7M15S 

您可能會注意到,我有點不確定確定幾個月的持續時間,因爲實際月份是不是全部相同的大小。我只計算了幾天的時間,所以如果你有很長的時間,你仍然只能看到高端的日子。

相關問題