EisFuX: Wochentagsberechnungen ohne strtotime()

Beitrag lesen

(Hallo|Hi(ho)|Mahlzeit) ABC_Mann,

für Fälle, in denen strtotime() versagt, weil das Datum außerhalb des Timestamp-Bereiches liegt,
kannst du auf die Julianische Tagesnummer (auch Julianisches Datum, Julian Day Number) zurückgreifen.
Aus der lässt sich leicht der passende Wochentag bestimmen.
Monatsgrenzenprobleme lösen sich damit in Luft auf:

  
function jdn_next_weekday(  
  $jdn, /// JDN des Basis-Datums  
  $weekday_wanted /// Wochentagsnummer (0...6) des gewünschten nächsten Wochentags  
) {  
  $current_weekday = ($jdn + 1) % 7; // Wochentag des Basisdatums  
  if ($current_weekday >= $weekday_wanted) {  
    // Wochentag des BD liegt nach dem gewünschten Wochentag  
    // (oder ist am gleichen Tag)  
    $jdn_wanted = $jdn - $current_weekday + 7; // JDN des nächsten Sonntags  
  }  
  else {  
    // Wochentag des BD liegt vor dem gewünschten Wochentag  
    $jdn_wanted = $jdn - $current_weekday;  // JDN des vorherigen Sonntags  
  }  
  $jdn_wanted += $weekday_wanted; // Sonntag (== 0) + gewünschter Wochentag  
  return $jdn_wanted; // JDN des gewünschten nächsten Wochentages  
}  

Lesetipps:
* PHP-Kalenderfunktionen
* gregorianToJD()
* cal_from_jd()

  
// Test  
$test = array (  
  array (2009, 6, 18),  // THU  
  array (2009, 6, 21),  // SUN  
  array (2009, 6, 23),  // TUE  
);  
  
// Gewünschte Wochentagsnummer  
$day_in_week_wanted = 1; // SUN: 0, MON: 1, ... WED: 3, ...  
  
foreach ($test as $date_array) {  
  list ($year, $month, $day_in_month) = $date_array;  
  
  // JDN des Basis-Datums berechnen  
  $jdn = gregoriantojd($month, $day_in_month, $year);  
  // JDN des nächsten gewünschten Wochentags berechnen  
  $next_jdn_wanted = jdn_next_weekday($jdn, $day_in_week_wanted);  
  
  // Datums-Array des gewünschten nächsten Wochentags  
  $cal_next = cal_from_jd($next_jdn_wanted, CAL_GREGORIAN);  
  print_r($cal_next);  
  
  // nur zum Vergleich: das Datums-Array des Basisdatums  
  $cal_today = cal_from_jd($jdn, CAL_GREGORIAN);  
  print_r($cal_today);  
}

Weitere folgende Wochentage erhältst du, indem du für jede Woche 7 zur jeweiligen Tagesnummer addierst.

MffG
EisFuX