strtotime不能直接使用ISO 8601格式(例如。P1Y1DT1S),但它所理解的格式(1Year1Day1Second)并不遥远 - 这将是一个非常直接的转换。(有点“黑客”...但那是你的PHP)。
谢谢李,我不知道strtotime接受了这种格式。这是我的谜题中缺失的部分。也许我的函数可以完成你的答案。
function parse_duration($iso_duration, $allow_negative = true){
// Parse duration parts
$matches = array();
preg_match('/^(-|)?P([0-9]+Y|)?([0-9]+M|)?([0-9]+D|)?T?([0-9]+H|)?([0-9]+M|)?([0-9]+S|)?$/', $iso_duration, $matches);
if(!empty($matches)){
// Strip all but digits and -
foreach($matches as &$match){
$match = preg_replace('/((?!([0-9]|-)).)*/', '', $match);
}
// Fetch min/plus symbol
$result['symbol'] = ($matches[1] == '-') ? $matches[1] : '+'; // May be needed for actions outside this function.
// Fetch duration parts
$m = ($allow_negative) ? $matches[1] : '';
$result['year'] = intval($m.$matches[2]);
$result['month'] = intval($m.$matches[3]);
$result['day'] = intval($m.$matches[4]);
$result['hour'] = intval($m.$matches[5]);
$result['minute'] = intval($m.$matches[6]);
$result['second'] = intval($m.$matches[7]);
return $result;
}
else{
return false;
}
}
该函数还支持负格式。-P10Y9MT7M5S 将返回一个数组,如:[年] => -10 [月] => -9 [日] => 0 [小时] => 0 [分钟] => -7 [秒] => -5 如果不需要此行为,则将 false 作为第二个参数传递。这样,函数将始终返回正值。最小值/加号在结果键 ['符号'] 中仍然可用。
还有一点更新:这个函数使用第一个函数来获取总秒数。
function get_duration_seconds($iso_duration){
// Get duration parts
$duration = parse_duration($iso_duration, false);
if($duration){
extract($duration);
$dparam = $symbol; // plus/min symbol
$dparam .= (!empty($year)) ? $year . 'Year' : '';
$dparam .= (!empty($month)) ? $month . 'Month' : '';
$dparam .= (!empty($day)) ? $day . 'Day' : '';
$dparam .= (!empty($hour)) ? $hour . 'Hour' : '';
$dparam .= (!empty($minute)) ? $minute . 'Minute' : '';
$dparam .= (!empty($second)) ? $second . 'Second' : '';
$date = '19700101UTC';
return strtotime($date.$dparam) - strtotime($date);
}
else{
// Not a valid iso duration
return false;
}
}
$foo = '-P1DT1S';
echo get_duration_seconds($foo); // Output -86399
$bar = 'P1DT1S';
echo get_duration_seconds($bar); // Output 86401