2015-04-10 4 views
0

Я не мог найти способ помочь мне сделать следующее. Мне даются следующие два значения времени: PT1H30M и PT1H45M. Моя цель - добавить два значения времени вместе, чтобы получить PT2H5M.Есть ли функция php или более эффективный способ добавить два iso 8601 раз вместе?

Есть ли какие-либо функции или более эффективный способ написать это?

Это то, что я сделал для каждого из аргументов, который был принят через:

  • Remove PT от значения времени.
  • Извлечение H и M в отдельные переменные.
  • Удалены H и M из этих переменных и убедитесь, что остальные значения имеют тип int.
  • Добавлены два значения часов вместе, а также значения двух минут.
  • Если сумма минут превышает 59, она разбита и добавлена ​​к часам.
  • Результаты возвращаются как сумма двух значений времени.

Вот мой пример кода:

//* _h is short for hours and _m is short for minutes 
function iso8601TimeSum($t1 = '', $t2 = '') { 
    if(!$t1 && !$t2) 
     return ''; 

    //remove PT 
    $t1 = str_replace('PT', '', $t1); 
    $t2 = str_replace('PT', '', $t2); 

    //extract ??[H|h] and ??[M|m] 
    $t1h_found = preg_match('/[00-59][Hh]/i', $t1, $t1_h); 
    $t1m_found = preg_match('/[00-59][Mm]/i', $t1, $t1_m); 
    $t2h_found = preg_match('/[00-59][Hh]/i', $t2, $t2_h); 
    $t2m_found = preg_match('/[00-59][Mm]/i', $t2, $t2_m); 

    //remove H|h and M|m from extracted values 
    if($t1h_found) 
     $t1_h = intval(preg_replace('/[Hh]/i', '', $t1_h[0])); 

    if($t1m_found) 
     $t1_m = intval(preg_replace('/[Mm]/i', '', $t1_m[0])); 

    if($t2h_found) 
     $t2_h = intval(preg_replace('/[Hh]/i', '', $t2_h[0])); 

    if($t2m_found) 
     $t2_m = intval(preg_replace('/[Mm]/i', '', $t2_m[0])); 

    //add it together 
    $calc_t_h = (!empty($t1_h) ? $t1_h : 0) + (!empty($t2_h) ? $t2_h : 0); 
    $calc_t_m = (!empty($t1_m) ? $t1_m : 0) + (!empty($t2_m) ? $t2_m : 0); 

    //if minutes exceeds 59 break it down and add it to the hours. 
    if($calc_t_m > 59) { 
     $calc_t_h += round($calc_t_m/60); 
     $calc_t_m = $calc_t_m % 60; 
    } 

    return 'PT' . ($calc_t_h > 0 ? $calc_t_h . 'H' : '00H') . ($calc_t_m > 0 ? $calc_t_m . 'M' : '00M'); 
} 

var_dump(iso8601TimeSum('PT1H30M', 'PT1H45M')); 
//*/ 
+0

Те являются [ 'DateInterval'] (http://php.net/manual/class.dateinterval.php) строки, а не * «значения времени» * – Phil

ответ

0

Вы должны использовать DateTime объекты, есть удобные функции, анализирующие даты на основе формата: проверить http://php.net/manual/en/datetime.createfromformat.php

DateTime объекты также могут быть использованы с математикой операции. Я лично использую эту обертку: https://github.com/briannesbitt/Carbon

Реализация вашей логики будет significanlty легче тогда