pretty_date – relative Zeitangaben in Worten

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 X Sekunden”, “vor einer Minute”, “vor X Minuten”
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 X Stunden”
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 X Tagen”
Bei weniger als 4 Wochen:
“vor einer Woche”, “vor X Wochen”
Bei weniger als 12 Monaten:
“vor einem Monat”, “vor X Monaten”
Bei weniger als 18 Monaten:
“vor einem Jahr”, “vor eineinhalb Jahren”
Bei mehr als 18 Monaten:
“vor X Jahren”

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';
}