Для того, щоб стандартизувати формат дати та часу в різних системах, організація ISO (International Organization for Standardization) випустила міжнародний стандарт ISO 8601, який отримав за свою історію досить багато редакцій. ISO 8601 позначає дату та час, починаючи з року, за яким слідують місяць, день, година, хвилини, секунди та мілісекунди.
Конвертація тривалості часу в ISO 8601 на PHP

Що таке тривалість часу ISO 8601?

Стандартизований набір форматів дати й часу ISO 8601 допоможе програмісту впоратися з визначенням тривалістю часу, який означає проміжок часу між двома датами або часом. Цей формат відображає тривалість у такому форматі: PnYnMnDTnHnMnS, де n число для відповідного інтервалу: Y - роки, M - місяці, W - тижні, D - дні, T - розмежувач між датами та часом, необхідний для усунення неоднозначності між місяцями та хвилинами, H - години, M - хвилини, S - секунди.

Ви можете залишити певні інтервали вимкненими, якщо вони не застосовуються, але ви повинні включити T перед будь-якими інтервалами часу (P<date>T<time>). Допустимі приклади включають: P3Y6M4DT12H30M5S (3 роки, 6 місяців, 4 дні, 12 годин, 30 хвилин і 5 секунд), P3DT12H (3 дні 12 годин), P1M (1 місяць), PT1M (1 хвилина).

Конвертація в ISO 8601 на PHP

Для конвертації тривалості часу у стандартизований формат ISO 8601 можна використовувати наступну функцію:
function time_to_iso8601_duration($time) {
$units = array(
'Y' => 365 * 24 * 3600,
'D' => 24 * 3600,
'H' => 3600,
'M' => 60,
'S' => 1,
);

$str = 'P';
$istime = false;

foreach ($units as $unitName => &$unit) {
$quot = intval($time / $unit);
$time -= $quot * $unit;
$unit = $quot;
if ($unit > 0) {
if (!$istime && in_array($unitName, array('H', 'M', 'S'))) {
$str .= 'T';
$istime = true;
}
$str .= strval($unit).$unitName;
}
}
return $str;
}
Приклад використання:
$seconds = strtotime("14:06:00", 0);
echo time_to_iso8601_duration($seconds);