[PHP] Datum im "Facebook-Stil" ausgeben

12/04/2012 16:44 Jaezer#1
Ich fange zurzeit mit einem kleinen Messenger an und nutze dafür PHP. Für die Ausgabe des Datums habe nutze ich den Facebook-Sitl e. In meinem ersten Tutorial hier in diesem Forum würde ich euch gerne erklären, wie ihr dies umsetzen könnt.


Ein Beispiel:
Standard Format: Kommentar wurde verfasst am 17.08.2012 - 20:30 Uhr
Facebook Stil: Kommentar wurde verfast "vor 2 Stunden"

Ich stelle euch hier meine Funktion zur Verfügung und erkläre euch im Anschluss darauf wie alles funktioniert.

1. Die Funktion: date.inc.php

PHP-Code:
Code:
<?php

// Datum im Facebook Stil
function niceDate($timestamp)
{
    $difference = time() - $timestamp;
    $periods = array("Sekunde", 
                     "Minute", 
                     "Stunde", 
                     "Tage", 
                     "Woche",
                     "Monate", 
                     "Jahre", 
                     "Jahrzehnte"
    );
    $lengths = array("60","60","24","7","4.35","12","10");

    if ($difference > 0) 
    {
        // Vergangenheit
        $ending = "vor";
    } else {
        // Zukunft
        $difference = -$difference;
        $ending = "noch";
    }

    for($j = 0; $difference >= $lengths[$j]; $j++)
    {
        $difference /= $lengths[$j];
        $difference = round($difference);
    }
    
    if($difference != 1) 
    {
        $periods[$j].= "n";
    }
    else
    {
        if($periods[$j] == "Woche" || $periods[$j] == "Stunde" || $periods[$j] == "Minute" || $periods[$j] == "Sekunde")
        {
            $periods[$j] = $periods[$j];
        }
        else
        {
            $periods[$j] = substr($periods[$j], 0, -1);
        }
    }
    
    $date= "$ending $difference $periods[$j]";
    
    return $date;
}
?>
Im Detail erklärt:

1.
PHP-Code:
Code:
$difference = time() - $timestamp;
Berechnet die Differenz zwischen der aktuellen Serverzeit und eurem Timestamp. Der Timestamp kann beispielsweise aus einer Datenbank stammen. Solltet ihr in eurer Datenbank das DATETIME Format nutzen, dann konvertiert das Datum bei der SELECT Abfrage direkt in einen Unix-Timestamp um.

Das Datum könnt ihr folgendermaßen zu einem Unix-Timestamp konvertieren:
Code :

Code:
SELECT 
    id,
    nachricht,
    UNIX_TIMESTAMP(date) AS unix_date
FROM 
    nachrichten
2.
PHP-Code:
Code:
if ($difference > 0) 
{
    // Vergangenheit
    $ending = "vor";
} else {
    // Zukunft
    $difference = -$difference;
    $ending = "noch";
}
Pürft, ob die Zeitdifferenz in der Vergangenheit oder in der Zukunft liegt und legt dementsprechend die $ending Variable fest, welche später zur Ausgabe dient.


3.
PHP-Code:
Code:
if($difference != 1) 
{
    $periods[$j].= "n";
}
else
{
    if($periods[$j] == "Woche" || $periods[$j] == "Stunde" || $periods[$j] == "Minute" || $periods[$j] == "Sekunde")
    {
        $periods[$j] = $periods[$j];
    }
    else
    {
        $periods[$j] = substr($periods[$j], 0, -1);
    }
}
Hier wird zuerst geprüft, ob die Differenz ungleich 1 ist was bewirkt, dass die Perioden in der Mehrzahl ausgegeben werden (Beispiel: vor 3 Tage"n"). In der darauffolgenden if-Abfrage dient der späteren Lesbarkeit. (Beispiel: 1 Tag(e) - grammatikalisch falsch) Daher wird für die Perioden "Tage, Monate, Jahre und Jahrzehnte" das letzte Zeichen abgeschnitten woraus sich ergibt: 1 Tag, 1 Monat, 1 Jahr, 1 Jahrzehnt.


4.
PHP-Code:
Code:
$date= "$ending $difference $periods[$j]";
Zusammenbau der Variable, die für die Ausgabe der Differenz-Zeit zuständig ist.


Fertiges Beispiel:
PHP-Code:
Code:
<?php

// Include der Funktions-Datei
include("date.inc.php");

// Aktuelle Zeit als Timestamp
$timestamp = time();
$niceDate = niceDate($timestamp);

echo $niceDate;

?>
Fertig!

Ich hoffe mein erstes Tutorial hat euch gefallen. Ich würde mich sehr über Feedback / Verbesserungsvorschläge freuen.

Vielen Dank für's lesen!

Euer
Jaezer
12/04/2012 16:54 яαкєѕтχ3#2
Nice Tutorial ;) kann viele Leute sehr hilfreich sein.
12/04/2012 17:35 kissein#3
Quote:
Ich stelle euch hier meine Funktion zur Verfügung und erkläre euch im Anschluss darauf wie alles funktioniert.
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

4 Jahre alten Quellcode als eigen verkaufen ist dreist, aber wenigsten hast es ins deutsche übersetzt ;)
12/04/2012 22:43 Synatex#4
Hat er nicht :)

[Only registered and activated users can see links. Click Here To Register...]
12/20/2012 20:17 guterelfe#5
Quote:
Originally Posted by Synatex View Post
Hat er nicht :)

[Only registered and activated users can see links. Click Here To Register...]
hahaa das hat er 1 zu 1 übernommen :D
12/20/2012 23:31 +Yazzn#6
Wie dreist manche Leute doch sind.