Die Funktion pretty_date() erwartet als Parameter ein beliebiges in englischer Textform angegebenes Datum (siehe strtotime) und liefert eine Zeitangabe in Worten relativ zum jetzigen Zeitpunkt zurück, z.b. “vor einer viertel Stunde”, “heute Morgen”, “gestern Abend” oder “vor 2 Wochen”.
string pretty_date ( [ string $datestr='' ] )
Definition der Datumsangaben
- Liegt das Datum weniger als 12,5 Minuten in der Vergangenheit wird ein String in folgender Form zurückgeliefert:
- “vor einer Sekunde”, “vor
XSekunden”, “vor einer Minute”, “vorXMinuten” - Bei weniger als 60 Minuten:
- “vor einer viertel Stunde”, “vor einer halben Stunde”, “vor einer dreiviertel Stunde”
- Bei weniger als 6 Stunden:
- “vor einer Stunde”, “vor
XStunden” - Bei weniger als 36 Stunden:
- “heute Vormittag”, “letzte Nacht”, “gestern Abend”, “vorgestern Nachmittag”…
Dabei gilt:- “Morgen”
- (Tag beginnt) 05:00 – 9:00
- “Vormittag”
- 09:00 – 11:30
- “Mittag”
- 11:30 – 13:30
- “Nachmittag”
- 13:30 – 18:00
- “Abend”
- 18:00 – 22:30
- “Nacht”
- 22:30 – 05:00 (Tag endet)
- Bei weniger als 7 Tagen:
- “vor einem Tag”, “vor
XTagen” - Bei weniger als 4 Wochen:
- “vor einer Woche”, “vor
XWochen” - Bei weniger als 12 Monaten:
- “vor einem Monat”, “vor
XMonaten” - Bei weniger als 18 Monaten:
- “vor einem Jahr”, “vor eineinhalb Jahren”
- Bei mehr als 18 Monaten:
- “vor
XJahren”
Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | function pretty_date( $datestr='' ) { $now = time(); $date = strtotime($datestr); $d = $now-$date; if( $d < 60 ) { $d = round($d); return 'vor '.($d==1?'einer Sekunde':$d.' Sekunden'); } $d = $d/60; if( $d < 12.5 ) { $d = round($d); return 'vor '.($d==1?'einer Minute':$d.' Minuten'); } switch( round($d/15) ) { case 1: return 'vor einer viertel Stunde'; case 2: return 'vor einer halben Stunde'; case 3: return 'vor einer dreiviertel Stunde'; } $d = $d/60; if( $d < 6 ) { $d = round($d); return 'vor '.($d==1?'einer Stunde':$d.' Stunden'); } if( $d < 36 ) { // ein Tag beginnt um 5 Uhr morgens $day_start = 5; if( date('j',($now-$day_start*3600)) == date('j',($date-$day_start*3600)) ) $r = 'heute'; elseif( date('j',($now-($day_start+24)*3600)) == date('j',($date-$day_start*3600)) ) $r = 'gestern'; else $r = 'vorgestern'; $hour_date = intval(date('G',$date)) + (intval(date('i',$date))/60); $hour_now = intval(date('G',$now)) + (intval(date('i',$now))/60); if( $hour_date>=22.5 || $hour_date<$day_start ) { $r = $r=='gestern' ? 'letzte Nacht' : $r.' Nacht'; } elseif( $hour_date>=$day_start && $hour_date<9 ) $r .= ' Morgen'; elseif( $hour_date>=9 && $hour_date<11.5 ) $r .= ' Vormittag'; elseif( $hour_date>=11.5 && $hour_date<13.5 ) $r .= ' Mittag'; elseif( $hour_date>=13.5 && $hour_date<18 ) $r .= ' Nachmittag'; elseif( $hour_date>=18 && $hour_date<22.5 ) $r .= ' Abend'; return $r; } $d = $d/24; if( $d < 7 ) { $d = round($d); return 'vor '.($d==1?'einem Tag':$d.' Tagen'); } $d_weeks = $d/7; if( $d_weeks<4 ) { $d = round($d_weeks); return 'vor '.($d==1?'einer Woche':$d.' Wochen'); } $d = $d/30; if( $d<12 ) { $d = round($d); return 'vor '.($d==1?'einem Monat':$d.' Monaten'); } if( $d<18 ) return 'vor einem Jahr'; if( $d<21 ) return 'vor eineinhalb Jahren'; $d = round($d/12); return 'vor '.$d.' Jahren'; } |
Danke, du hast mir viel Arbeit erspart. Schöne, nützliche Funktion.
Also ich hab den Code auch mal ausprobiert, jedoch zeigt die Funktion mir an, dass ein Artikel der heute um 17:10 Uhr veröffentlicht wurde, “letzte Nacht” gepostet wurde? Ich hab die Funktion genau so übernommen, wie sie hier ist.
Eingebunden habe ich die Funktion in der loop.php (ich verwende WordPress):
Stimmt deine Serverzeit mit der Zeiteinstellung in Wordpress überein?
Wenn nicht, solltest du Zeile 2 entsprechend anpassen.
Und bei Wordpress solltest du die Funktion besser in der Datei
functions.phpeinfügen statt in derloop.php.Also ich habe die Funktion natürlich in der functions.php gespeichert. In der loop.php muss ich sie aber natürlich aufrufen. ;-)
Ich hab in den WordPress Einstellung die Zeit mal auf UTC+2 gestellt, da es ja keine Sommer- und Winterzeit automatisierung gibt. jedoch hat das auch nichts gebracht.
Meine Serverzeit, also lokal bei xammp ist komischerweise auf UTC+0 eingestellt, also hab ich in WordPress auch mal UTC+0 eingestellt, ändern tut sich aber auch nix … :-(
Ich hab ne Lösung gefunden, jedoch passt das noch nicht ganz hinbekommen. ich hab das jetzt wie folgt eingebunden:
Jedoch stimmt das noch nicht auf die Sekunde genau, da wenn ich eine Beitrag vor 3 Sekunden veröffentlicht habe, steht da nicht “vor 3 Sekunden” sondern einfach nur “heute”. Das könnte vielleicht daran liegen, dass der erzeugte Timestamp nicht auf die Sekunde genau ist, da das Datumsformat vielleicht flasch ist…
Ich habe mal eine kleine Frage als PHP-Anfänger: Wo genau muss ich jetzt mein Datum und meine Uhrzeit (unteranderem aus MySQL DB) eintragen, und in welchem Format. Irgendwie komme ich nicht ganz weiter, mit dem, was ich bisher ausprobierte …
Hoffe, die Frage klingt nicht gar zu blöd :-)
Vielen Dank im Voraus