wunderBAR: Die Lösung

Beitrag lesen

Hallo Forum,

ich habe die Lösung zu dem Problem gefunden. Es war aber wirklich nicht einfach und mit vielen vielen Notizzetteln und Gegenüberstellungen der Jahre verbunden.

Damit ihr und diejenigen, die diesen Thread später im Archiv finden, auch etwas davon habt, beschreibe ich euch ausführlich, wie ihr vorgehen müsst.

Zuerst muss man unterscheiden, ob ein Jahr 52 oder 53 Wochen hat. Denn dann berechnen sich die Daten GANZ(!) anders. Und hierbei tut sich schon das erste Problem auf - wie macht man das?
Wenn man genau hinschaut, sieht man, dass der 4.1. IMMER in KW1 liegt. Demnach kann man mit dem Tag davor, also dem 3.1., Unfug treiben. Denn entweder liegt der in KW1, oder nicht. Wenn der 3.1. also in KW1 liegt, hat das *vorhergehende* Jahr 52 Wochen. Ansonsten 53.

  
function get_max_kw_a_year($year)  
{  
	$day = date("W", mktime(0,0,0,1,3,$year+1));  
  
	if($day==1)  
		return 52;  
	else  
		return 53;  
}  

Mit dem Rückgabewert dieser Funktion wird nun unterschieden, ob ein Jahr 52 oder 53 Wochen hat. Im Moment ist es belanglos, ob die KW53 noch ins nächste Jahr hineinhängt. Denn es geht ja nur darum, die Wochenanzahl eines Jahres, die dem zugeordnet sind, zu bekommen.

Die Vorgehensweise bei 53 Wochen ist einfach. Man nehme die Anzahl der Tage der gewünschten KW. 5 Wochen haben 5*7=35 Tage. Man muss nur noch die Differenz zwischen dem 1.1 und dem darauffolgenden Sonntag subtrahieren. Im Jahr 2009 sind das 4 Tage (nämlich Donnerstag 1.1.2009, Freitag 2.1.2009, Samstag 3.1.2009 und Sonntag 4.1.2009). Man bekommt dann den Tag, an dem die gewünschte KW endet (Sonntag).

Demnach bei KW5 in 2009:
5 * 7 = 35
35 - 4 = 31

Ein Blick in den Kalender zeigt, dass KW5 /2009 am 1.2.2009 endet. Man erkennt, dass man die gewonnen Zahl (31) nur zum 1.1.2009 hinzuaddieren muss.

  
if(get_max_kw_a_year($_SESSION['year']) == 53)  
{  
	$sonntag = $_SESSION['kw'] * 7;  
	$sonntag = $sonntag - (7 - date("w", strtotime(($_SESSION['year']-1)."-12-31")));  
	$sonntag = $sonntag * (24*60*60);  
	$sonntag = $sonntag + strtotime($_SESSION['year']."-01-01");  
}  

(Ich erstelle hier einen Timestamp, da ich den später noch brauche.)

Ganz anders sieht es aus, wen ein Jahr 52 Wochen hat.
Ich bin hier so vorgegangen, dass ich die KWs schon einmal hinzuaddiere. Danach entscheide ich erst, wie viele Tage noch auf den gewünschten Sonntag fehlen. Oder welche zuviel sind. Denn auch das gibt es:

2010 +2 Tage
2011 +1 Tag
2012 +-0
2013 -2 Tage
2014 -3 Tage
2016 +2 Tage

Also braucht man nun einen Indikator, der mir "addieren" oder "subtrahieren" sagt. Also musste ich wieder den Kalender zur Hand nehmen und vergleichen. In den Jahren von 1995 bis 2025 mit 52 KWs fiel auf, dass man addieren muss, wenn der 1.1. des Jahres NICHT in der ISO-KW 1 liegt. Subtrahieren muss man, wenn das nicht der Fall ist. Gar nichts addieren oder subtrahieren muss man, wenn der 1.1. ein Sonntag ist.
Jetzt wissen wir, ob wir addieren oder subtrahieren müssen. Aber *was* müssen wir eigentlich addieren/subtrahieren? Addieren müssen wir, wie oben, die Differenz vom 1.1. zum nächsten Sonntag. Subtrahiert werden muss nur der Tag der Woche des 1.1. (Sonntag = 0, Montag = 1, etc ...).
So entsteht dann der else-Teil:

  
else  
{  
	$ber=$_SESSION['year']."-01-01 +".$_SESSION['kw']." weeks";  
  
	if(date("w", $_SESSION['year']."-01-01")!=0)  
	{  
		if(date("W",strtotime($_SESSION['year']."-01-01"))!=1)  
			$ber.=" +".(7 - (date("w", strtotime($_SESSION['year']."-01-01"))))." days";  
		else  
			$ber.=" -".date("w", strtotime($_SESSION['year']."-01-01"))." days";  
	}  
  
	$sonntag = strtotime($ber);  
}  

Für den Montag müssen noch 6 Tage abgezogen werden:

  
$montag  =  $sonntag -(24*60*60 * 6);  

Und "schon" haben wir $montag und $sonntag zur angegebenen KW und dem angegebenen Jahr. Wenn ihr jetzt noch irgendwo Denkfehler seht, oder noch den ein oder anderen Fall, den dieser Code nicht mit macht, bin ich euch sehr verbunden, wenn ihr es noch schreiben könntet.

Liebe Grüße
wunderBAR