Errechnung eines Datums aus Kalenderwoche und Tag

worki2k1

Erfahrenes Mitglied
Hallo Leute,

im Grunde habe ich gleich 2 Probleme, wobei eins sich durch das andere Lösen lässt. Ich habe die Nummer einer Kalenderwoche und die Nummer eines Tages (0 = Sonntag, 1 = Montag, ...). Ich möchte aus diesen beiden Daten gern das Datum errechnen.

Beispiel:

Kalenderwoche: 35
Tag: Freitag

Ergebnis soll sein: 29.08.2003


Ich sitz jetzt schon ein paar Tage und mir fallen absolut keine Lösungsansätze ein. Gibt es da eine einfache Lösung mit möglichst niedriger Prozessauslastung? Da ich eine große Menge an Daten habe, wäre besser wenn das Script nicht so serverlastig wäre.

Daraus würde sich dann auch mein 2. Problem lösen: Errechnung des Datums des Montags der KW und des Freitags der KW.

Ich hoffe mir kann jemand helfen.



Gruß
Karl
 
Hallo Karl.

Ich habe zwar grad keine Möglichkeit, die Sache zu testen, aber ich meine, dass es so möglich sein sollte (es wird allerdings immer das Jahr 2003 angenommen, weil du darüber ja keine Information zu haben scheinst):
PHP:
$tage  = array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday');
$kw    = 10;
$tag   = 2; // also Mittwoch
$datum = date('d.m.Y', strtotime('+' . $kw . ' weeks ' . $tage[$tag], mktime(0, 0, 0, 0, 0, 2003)));
In der Variablen $datum sollte nun das gesuchte Datum stehen (wie gesagt - ohne Gewähr auf Funktionalität^^)
 
Das Jahr brauchst du natürlich auch noch gell ? ;)
Also meine Idee mag vielleicht nicht die günstigste sein, aber da mir keine Funktion oder Routine bekannt ist, die so etwas übernehmen könnte, sieht mein Gedankengang wie folgt aus.

Du erstellst über eine automatische Routine (sollte sich recht leicht selbst coden lassen) ein zweidimensionales Array.
PHP:
$array['kalenderwoche']['tag'] //um es mal anschaulich darzustellen.
Als Wert darin speicherst du jeweils immer den UNIX-Timestamp des Datums. Wenn man das ganze über eine Routine macht und vom 1.1 des Jahres immer 86400 Sekunden pro Tag dazu addiert, so hat man am Ende ein wunderbares Array mit 52 Elementen in der Kalenderwoche à 7 Unterelemente (? heisst das so ?) im Tages Element.
Wenn man sich damit dann den timestamp ausgeben lässt, kann man den ja einwandfrei über date() formatieren.

//edit: Ok die Lösung von SynDrome ist da irgendwie besser denke ich :rolleyes:
 
Zuletzt bearbeitet:
Der Lösungsansatz von SynDrome war sehr gut. Mit leichten Anpassungen lief es dann auch (scheinbar):

PHP:
$tage  = array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday');
$kw    = 35;
$tag   = 4; // also Freitag

$mydate = $kw." ".$tage[$tag];

$datum = date('d.m.Y', strtotime($mydate, mktime (0, 0, 0, 1, 1, 2003)));

echo $datum;


Es gibt nur an dieser Stelle ein Problem mit dem Datum und dem ersten Tag im Jahr. Dieses Jahr (2003) war der 01.01. ein Mittwoch. Wenn ich also nach einem Tag >= 4 suche, ist das Ergebnis richtig. Wenn ich jetzt aber nach einem Tag suche, der vor dem Tag des 01.01. liegt (spricht Montag und Dienstag), dann ist das Ergebnis falsch:

Bei Jahr=2003, KW=35 und Tag = 4 ist das Ergebnis 29.08.2003 richtig

Bei Jahr=2003, KW=35 und Tag = 0 ist das Ergebnis 01.09.2003 falsch


Ich habe auch noch einen umständlichen Lösungsansatz:
Ich schau welcher der erste Tag in der ersten Kalenderwoche eines Jahres ist. Kann ja nur einer der ersten 7 Tage sein. Dann nehme ich mir die Nummer des Tages innerhalb des Jahres und addiere dazu KW * 7 dazu und befinde mich dann eigentlich innerhalb der gesuchten Kalenderwoche. Jetzt gucke ich bei welchem Tag ich gelandet bin und ziehe, je nachdem welchen Tag ich suche, einen bestimmten Wert ab oder addiere einen dazu. Als Resultat hätte ich die genaue Nummer des Tages, den ich suche. Jetzt brauch ich nur noch zurückrechnen welchem Datum das entsprechen würde.

An sich dürfte das funktionieren, ist aber doch etwas umständlich.
 
Zuletzt bearbeitet:
Freut mich ja erstmal, dass der Ansatz einigermaßen funktioniert^^
Allerdings ist das genannte Problem wirklich etwas schwierig. Habe momentan leider auch keine Lösungsidee (bin grad im Informatikunterricht, hehe). Vielleicht sollte man doch einen anderen Ansatz nutzen?
 
So, habe die Lösung jetzt:

PHP:
function kalwo($t)
{
  $y = date ('Y', $t);
  $w = date ('w', $t);
  $z = date ('z', $t);
  $wjan4 = (367 +$w -$z) % 7;
  $kw = (int)(1 +($z -3 +$wjan4) / 7) - !$w + !$wjan4;
  if ($kw == 53 && $wjan4 >= 4) 
  {
    $kw = 1;
    $y++;
  }
  $kw = (str_pad ($kw, 2, "0", STR_PAD_LEFT));
  
  return $kw;
}

function finddate ($kw, $day, $year)
{

  /* Finde zunächst den ersten Tag der ersten Kalenderwoche */
  for ($dayoffset = 1; $dayoffset <= 7; $dayoffset++)
  {
    $currenttime = mktime (0, 0, 0, 1, $dayoffset, $year);
    if (kalwo ($currenttime) == 1)
    {
      break;
    }
  }
  
  /* Rechne nun die Wochen drauf */
  $currenttime += (($kw-1)*7*3600*24);

  $did = strftime ("%w", $currenttime);
  $diff = $did - $day;
  
  $currenttime += -($diff*3600*24);

  return $currenttime;    
}

$kw = 36;
$day = 3; // Mittwoch
$year = 2003;

$mydate = finddate ($kw, $day, $year);

echo strftime ("%d.%m.%Y", $mydate);

Ausgegeben werden müsste dann das exakte Datum des gewählten Tages innerhalb der gewählten Kalenderwoche.
 
Zurück