2009-09-02 2 views
1

У меня есть массив с раз (строки), например «2:23», «3: 2: 22» и т.д.добавить две или более строк времени в PHP

$times = array("2:33", "4:2:22", "3:22") //loner 

Я хочу, чтобы найти общую сумму всего массива.

Есть ли способ, что я мог бы добавить время как "2:33" и "3:33" ("I: s")

благодарит

+0

Каков ваш ожидаемый результат суммирования «2:33» и «3:33»? «5: 6» (например, 5 минут, 6 секунд)? –

+0

6:06 или 6 минут и 6 секунд – 2009-09-02 21:56:45

+0

да, вот что я имел в виду. –

ответ

2

Там нет встроенного способа сделать это - все функции времени работы на время, не на длительностях. В вашем случае вы можете explode() и дополнительно добавить детали . Я бы рекомендовал написать класс. Простой пример:

class Duration { 

    public static function fromString($string) { 
     $parts = explode(':', $string); 
     $object = new self(); 
     if (count($parts) === 2) { 
      $object->minutes = $parts[0]; 
      $object->seconds = $parts[1]; 
     } elseif (count($parts) === 3) { 
      $object->hours = $parts[0]; 
      $object->minutes = $parts[1]; 
      $object->seconds = $parts[2]; 
     } else { 
      // handle error 
     } 
     return $object; 
    } 

    private $hours; 
    private $minutes; 
    private $seconds; 

    public function getHours() { 
     return $this->hours; 
    } 

    public function getMinutes() { 
     return $this->minutes; 
    } 

    public function getSeconds() { 
     return $this->seconds; 
    } 

    public function add(Duration $d) { 
     $this->hours += $d->hours; 
     $this->minutes += $d->minutes; 
     $this->seconds += $d->seconds; 
     while ($this->seconds >= 60) { 
      $this->seconds -= 60; 
      $this->minutes++; 
     } 
     while ($this->minutes >= 60) { 
      $this->minutes -= 60; 
      $this->hours++; 
     } 
    } 

    public function __toString() { 
     return implode(':', array($this->hours, $this->minutes, $this->seconds)); 
    } 

} 

$d1 = Duration::fromString('2:22'); 
$d1->add(Duration::fromString('3:33')); 
echo $d1; // should print 5:55 
+0

большое спасибо! – 2009-09-02 22:11:10

5

Вы можете посмотреть на the PHP date/time functions - один вариант был бы использовать что-то вроде StrToTime():

$midnight = strtotime("0:00"); 

// ssm = seconds since midnight 
$ssm1 = strtotime("2:33") - $midnight; 
$ssm2 = strtotime("3:33") - $midnight; 

// This gives you the total seconds since midnight resulting from the sum of the two 
$totalseconds = $ssm1 + $ssm2; // will be 21960 (6 hours and 6 minutes worth of seconds) 

// If you want an output in a time format again, this will format the output in 
// 24-hour time: 
$formattedTime = date("G:i", $midnight + totalseconds); 

// $formattedTime winds up as "6:06" 
+0

Это дает мне значение 21960, которое не может быть правдой, не так ли? – 2009-09-02 22:01:46

+0

21960 составляет ровно 6 часов и 6 минут (6 * 3600 + 6 * 60), что является правильным ответом. – Amber

+0

Вы правы, но в моем случае 2:33 составляет 2 минуты и 33 секунды – 2009-09-02 22:05:36

0

Таким образом, вы хотите добавить продолжительность к времени, то есть добавить несколько часов, минут и секунд до времени?

Может быть, вы могли бы использовать StrToTime DAV, чтобы получить секунд от полуночи до поры до времени, а затем добавить длительность, используя sscanf, таким образом:

$midnight = strtotime("0:00"); 

// ssm = seconds since midnight 
$ssm1 = strtotime("2:33") - $midnight; 

// sscanf the time string... you might need to include the possibility of seconds 
list($hour, $minute) = sscanf("3:33", "%d:%d"); 

// a 
$answer_ssm = $ssm + $hour * 3600 + $minute * 60; 

echo strftime("%H:%M:%S", $answer_ssm);

Не можете проверить это, откуда я так пожалуйста извините любые синтаксические ошибки ... просто пытаюсь привести пример. Разумеется, вам также потребуется повторить выбор по вашему массиву.

Смежные вопросы