Rechnen mit Zeit

Zwei Zeiten mit PHP zusammen zu zählen ist einfach. Wenn man aber Stunden zusammenzählt welche über 24h ergeben will man nicht immer mit Tagen rechnen. In diesem Artikel werden 2 PHP Funktionen für mögliche Lösungen gezeigt.

Zeit hinzufügen


function timeAdd($time_a,$time_b,$format='%HT:%M:%S') {
	$ta = explode(':', $time_a);
	$tb = explode(':', $time_b);

	$sec_a = ($ta[0] * 60 * 60) + ($ta[1] * 60) + $ta[2];
	$sec_b = ($tb[0] * 60 * 60) + ($tb[1] * 60) + $tb[2];

	$total = $sec_a + $sec_b;
	$return['days'] = floor($total / (60 * 60 * 24));
	$total %= (60 * 60 * 24);
	$return['hours'] = floor($total / (60 * 60));
	$return['hours_total'] = $return['hours'] + ($return['days'] * 24);
	$total %= (60 * 60);
	$return['minutes'] = floor($total / 60);
	$return['seconds'] = $total % 60;

	if($format) {
		$str_return = $format;
		//$str_return = str_replace('%m',  $return['months'], $str_return);
		$str_return = str_replace('%d',  $return['days'], $str_return);
		$str_return = str_replace('%HT', str_pad($return['hours_total'], 2 , "0", STR_PAD_LEFT), $str_return);
		$str_return = str_replace('%H',  str_pad($return['hours'], 2 , "0", STR_PAD_LEFT), $str_return);
		$str_return = str_replace('%M',  str_pad($return['minutes'], 2 , "0", STR_PAD_LEFT), $str_return);
		$str_return = str_replace('%S',  str_pad($return['seconds'], 2 , "0", STR_PAD_LEFT), $str_return);
		return $str_return;
	} else {
		return $return;
	}
}

// Beispiele

// -- Anwendung 1
$start = '00:00:00';
for($i=0;$i<10;$i++) {
	$start = timeAdd($start,'01:26:14');
}
echo $start; // 14:22:20

// -- Anwendung 2
// JA, 70 und 61 ist nicht realistisch, aber das Ergebnis stimmt ;-)
echo timeAdd('20:70:61','100:31:60'); // 121:43:01

echo timeAdd('20:70:61','100:31:60','%d Tage, %H Stunden, %M Minuten, %S Sekunden');
// 5 Tage, 01 Stunden, 43 Minuten, 01 Sekunden  



Differenz von Zeit berechnen


function timeDiff($time_a,$time_b,$format='%n%HT:%M:%S') {
	$ta = explode(':', $time_a);
	$tb = explode(':', $time_b);

	$time_a = strtotime("1.1.2000 00:00:00 +$ta[0] hour $ta[1] minutes $ta[2] seconds");
	$time_b = strtotime("1.1.2000 00:00:00 +$tb[0] hour $tb[1] minutes $tb[2] seconds");

	$return = array();
	if($time_a > $time_b) {
		$difference = $time_a-$time_b;
		$return['negativ'] = false;
	} else {
		$difference = $time_b-$time_a;
		$return['negativ'] = true;
	}

	$return['days'] = floor($difference / (60 * 60 * 24));
	$difference %= (60 * 60 * 24);
	$return['hours'] = floor($difference / (60 * 60));
	$return['hours_total'] = $return['hours'] + ($return['days'] * 24);
	$difference %= (60 * 60);
	$return['minutes'] = floor($difference / 60);
	$return['seconds'] = $difference % 60;

	if($format) {
		$str_return = $format;
		//$str_return = str_replace('%m',  $return['months'], $str_return);
		$str_return = str_replace('%d',  $return['days'], $str_return);
		$str_return = str_replace('%HT', str_pad($return['hours_total'], 2 , "0", STR_PAD_LEFT), $str_return);
		$str_return = str_replace('%H',  str_pad($return['hours'], 2 , "0", STR_PAD_LEFT), $str_return);
		$str_return = str_replace('%M',  str_pad($return['minutes'], 2 , "0", STR_PAD_LEFT), $str_return);
		$str_return = str_replace('%S',  str_pad($return['seconds'], 2 , "0", STR_PAD_LEFT), $str_return);
		$negativ = ($return['negativ']) ? '-':'';
		$str_return = str_replace('%n',  $negativ, $str_return);
		return $str_return;
	} else {
		return $return;
	}
}

// Beispiele
 
echo timeDiff('100:31:60','20:70:61'); // 79:20:59

echo timeDiff('20:70:61','100:31:60'); // -79:20:59