Sekunden in lesbares Format umwandeln

Pre7ender

Mitglied
Hallo

Mein Problem ist eigentlich mehr ein mathematisches als ein PHP Problem.

Ich habe als Input eine Zahl, welche Sekunden darstellt.
Als Output hätte ich gerne diese Sekunden in Jahre, Monate, Tage, Stunden, Minuten und Sekunden umgewandelt! Zum Bleistift so:
3y 4m 2d 1h 34s

Der Monat soll als 30 Tage angesehen werden.

Natürlich kann es auch sein, dass die Sekunden umgewandelt nur wenige Tage darstellen und nicht Jahre etc..

thx
 
Hallo,

hatten wir zwar schon ziemlich oft, aber weil's so schön ist:
PHP:
<?php
function sec_to_str($sec) {
	$units = array(
		's' => 60,
		'min' => 60,
		'h' => 24,
		'd' => 30,
		'm' => 12,
		'y' => PHP_INT_MAX,
	);
	$result = array();
	foreach ($units as $u => $amount) {
		$result[$u] = $sec % $amount;
		$sec = floor($sec / $amount);
		if ($sec == 0) break;
	}
	return $result;
}

print_r(sec_to_str(123456789));

# =>
# Array
# (
#     [s] => 9
#     [min] => 33
#     [h] => 21
#     [d] => 18
#     [m] => 11
#     [y] => 3
# )
?>

Grüße,
Matthias
 
Zuletzt bearbeitet:
Danke für die Antwort, jedoch stimmt mit der Funktion irgend etwas nicht!

Beispiel
Acht Tage haben 604800 Sekunden (8x86400)

Rufe ich die Funktion mit soviel Sekunden als Parameter auf, erhalte ich das:
Code:
Array (     [s] => 0     [min] => 0     [h] => 48     [d] => 2 )

Zwei Tage stimmen nicht und 48 Stunden müssten ja zu zwei Tagen umgewandelt werden
Also vier Tage, was aber auch nicht stimmt... ?
 
Acht Tage haben 691200 Sekunden, sieben Tage die genannten 604800 Sekunden. Dennoch liefert die Funktion ein falsches Ergebnis. Deshalb:
PHP:
function sec_to_str( $sec ) {
	$retVal = array_combine(array('seconds', 'minutes', 'hours', 'days', 'months', 'years'), array(0,0,0,0,0,0));
	$retVal['seconds'] = $sec;
	$retVal['seconds'] -= ($retVal['years']=floor($retVal['seconds']/31104000)) * 31104000;
	$retVal['seconds'] -= ($retVal['months']=floor($retVal['seconds']/2592000)) * 2592000;
	$retVal['seconds'] -= ($retVal['days']=floor($retVal['seconds']/86400)) * 86400;
	$retVal['seconds'] -= ($retVal['hours']=floor($retVal['seconds']/3600)) * 3600;
	$retVal['seconds'] -= ($retVal['minutes']=floor($retVal['seconds']/60)) * 60;
	return $retVal;
}
 
Danke für die schnelle Antwort! Die Funktion passt!

Ich hab noch eine Frage bezüglich deiner Funktion.
Die Ausgabe deiner Funktion ist jetzt in diesem Format (mit einem simplen foreach ausgegeben):

38s 37min 23h 8d 0m 0y

Kann ich den Foreach so durchlaufen, dass er hinten im Array beginnt?
Es wäre einfacher als mit echo $var['year'] und noch auf 0 überprüfen etc..
 
PHP:
$dateStr = sec_to_str(604957);
$dateStr = array_reverse($dateStr, true);
foreach($dateStr as $unit => $value)
{
    if($value > 0)
    {
        echo "{$value}{$unit} ";
    }
}
 
Zuletzt bearbeitet:
Hallo,

bei meinem Code bin ich nur etwas mit den Einheiten verrutscht, im Grunde funktioniert er schon ;) Hab es oben mal entsprechend angepasst.

Grüße,
Matthias
 
Zurück