Zeit ausgeben zb vor min

maarian

Erfahrenes Mitglied
Hallo,


Mal ne Frage also ich speicher meine Zeit mit date("d m Y H:i:s"); in die Datenbank,

so jetzt möchte ich aber nicht zb 1.1.2007 03:50:20 ausgeben sondern zb


wenn unter einer Minute dann

vor sec

wenn über eine Minute

vor 1 min 33 sec

usw


kann mir mal jemand sagen wie das Funktioniert danke im vorraus
 
PHP:
$datum = "1.1.2007 03:50:20";

preg_match("/\s(?<Stunde>[0-9]{2}):(?<Minute>[0-9]{2}):(?<Sekunde>[0-9]{2})/i", $datum, $erg);

if($erg[Stunde] == "00")
	if($erg[Minute] == "00")
		echo "vor ".$erg[Sekunde]." Sekunden.";
	else
		echo "vor ".$erg[Minute]." Minuten ".$erg[Sekunde]." Sekunden.";
else
	echo "vor ".$erg[Stunde]." Stunden ".$erg[Minute]." Minuten ".$erg[Sekunde]." Sekunden.";
Wäre eine mögliche Lösung.
 
Moin ihr beiden,

payerot: Es scheint als hättest du vergessen die Differenz zwischen dem Datum aus der Datenbank und dem aktuellen Datum zu berechnen. Und was ist mit Singularformen?
Wenn du Strings als Array-Indizes hast solltest du diese in Singlequotes setzen.

maarian: Ich würde dir nahelegen den von MySQL für Datumsangaben mit Uhrzeit vorgesehenen Typen DATETIME Spaltentypen anstelle von VARCHAR zu benutzen. Das hat zum Vorteil, dass du dich der MySQL-eigenen Datums- und Zeitfunktionen bedienen kannst und die Zeitdifferenz sich einfach und unkompliziert über
SQL:
SELECT
    TIME_TO_SEC(TIMEDIFF(NOW(), spaltenname)) AS elapsed_seconds
FROM
    tablename
[...]

Um die Anzahl an Sekunden ins gewünschte Format zu bringen schreiben wir uns eine Funktion, etwa wie diese:
PHP:
function elapsedTimeToStr($seconds)
{
        $intervals = array(
                array(
                        'name'          => 'Sekunde',
                        'plural'        => 'n',
                        'seconds'       => 1
                ),
                array(
                        'name'          => 'Minute',
                        'plural'        => 'n',
                        'seconds'       => 60
                ),
                array(
                        'name'          => 'Stunde',
                        'plural'        => 'n',
                        'seconds'       => 3600
                ),
                array(
                        'name'          => 'Tag',
                        'plural'        => 'e',
                        'seconds'       => 86400
                ),
                array(
                        'name'          => 'Woche',
                        'plural'        => 'n',
                        'seconds'       => 604800
                )
                // nach Belieben erweitern
        );

        $output = '';
        $time = $seconds;
        for ($i = count($intervals)-1; $i >= 0; $i--)
        {
                $seconds = $intervals[$i]['seconds'];
                if ($time < $seconds)
                        continue;

                $value = floor($time / $seconds);
                $time -= $value * $seconds;

                $output .= $value . ' ' . $intervals[$i]['name'];
                if ($value > 1)
                        $output .= $intervals[$i]['plural'];
                $output .= ' ';
        }

        return $output;
}
Ist allerdings noch verbesserungsfähig. Wenn die Zeit beispielsweise im Bereich von mehreren Tagen liegt, werden Minuten/Sekunden wohl nicht mehr allzu relevant sein, oder?

Beste vorweihnachtliche Grüße an euch
Marvin
 
Ist ein ehrlich gesagt ziemlich unhandliches Format, sowohl für die elitären DBMS als auch für eine Sprache wie PHP.
Warum keinen Datentyp DATETIME in MySQL verwenden, oder die Zeitmarke als Unix-Timestamp (Integerwert), womit PHP normalerweise arbeitet?

PHP:
<?php
$now       = time();
$timestamp = 1197251250; // Timestamp im UNIX-Format aus der Datenbank
$timediff  = $now - $timestamp;

switch ( true ) {
    // Wochen
    case ( $timediff > 604800 ):
        echo intval( $timediff / 604800 ) . " Wochen, ";
        break; // Abbruch,da Rest wohl irrelevant...
    // Tage
    case ( $timediff > 86400 ):
        echo intval( $timediff / 86400 ) . " Tage, ";
        $timediff %= 86400;
    // Stunden
    case ( $timediff > 3600 ):
        echo intval( $timediff / 3600 ) . " Stunden, ";
        $timediff %= 3600;
    // Minuten
    case ( $timediff > 60 ):
        echo intval( $timediff / 60 ) . " Minuten, ";
        $timediff %= 60;
    // Sekunden
    default:
        echo $timediff . " Sekunden";
        break;
}

Sehr trivial, ich weiß - Lässt sich mit ner intelligenten Struktur, einem Array und einer Überprüfung anschließend aber wunderbar ausgeben.
 
Hallo,

ja das 1. hat auch nicht funktioniert setzte mich gleich nochmal ran und test das mal , echt nett das ihr euch die Mühe macht


Dankeschön
 
PHP:
function elapsedTimeToStr($seconds)
{
        $intervals = array(
                array(
                        'name'          => 'Sekunde',
                        'plural'        => 'n',
                        'seconds'       => 1
                ),
                array(
                        'name'          => 'Minute',
                        'plural'        => 'n',
                        'seconds'       => 60
                ),
                array(
                        'name'          => 'Stunde',
                        'plural'        => 'n',
                        'seconds'       => 3600
                ),
                array(
                        'name'          => 'Tag',
                        'plural'        => 'e',
                        'seconds'       => 86400
                ),
                array(
                        'name'          => 'Woche',
                        'plural'        => 'n',
                        'seconds'       => 604800
                )
                // nach Belieben erweitern
        );

        $output = '';
        $time = $seconds;
        for ($i = count($intervals)-1; $i >= 0; $i--)
        {
                $seconds = $intervals[$i]['seconds'];
                if ($time < $seconds)
                        continue;

                $value = floor($time / $seconds);
                $time -= $value * $seconds;

                $output .= $value . ' ' . $intervals[$i]['name'];
                if ($value > 1)
                        $output .= $intervals[$i]['plural'];
                $output .= ' ';
        }

        return $output;
}

Super Code Dankeee ;) nur leider zeigt er wenn ich gerade das Profil aktualisiere nichts an ,
zeigt nur über 1sec an kann man das auch so machen das er bei 0 Sek etwas anzeigt ?

weil sonst das Feld für die Zeit leer bleibt


Danke
 
Hey mariaan,
klar geht das, dazu fügst du am besten einfach am Anfang der Funktion eine if-Anweisung ein:
PHP:
if ($seconds == 0)
    return '0 Sekunden';

Gruß
Marvin
 
Einmal muss ich noch nerven =)


also kann man das auch so machen das er bei zb 2 std 3 min 4 sek aufrundet und immer nur eins anzeigt in dem Fall 2std


und wenn es min und sek sind dann nur min =)


Danke
 
Zurück