Doktor Knallcharge: Datum ohne wochenende ausgeben

Beitrag lesen

Ist es sinnvoller, das Ganze mit PHP zu machen?

Das kommt darauf an, wo du das Ganze benutzen willst. Soll ein Besucher auf einer Webseite das Startdatum eingeben und sofort das Ergebnis angezeigt bekommen, ist Javascript komfortabler, denn bei PHP muss der Kram erst an den Server geschickt werden. Benutzt du die Funktion eh in einem serverseitigen Skript, ist PHP sinniger, da du nicht abhängig von den Vorlieben des Benutzers bist (der Javascript vielleicht abgeschaltet hat).

function werktageAddieren($addTage)
{
    $zeitpunkt = time();
    $tag = getdate($zeitpunkt);
    if($tag['weekday'] == "Saturday")

Das ist unsauber. Es geht zwar aus der Anleitung nur indirekt hervor (durch Vergleich der englischen mit der deutschen Anleitung), aber getdate() gibt in weekday wohl den Namen in der jeweils gewählten Sprache aus – möglicherweise also in Deutsch.

Und selbst, wenn es immer der englische Name wäre, täte ich mich nicht darauf verlassen; in wday wird der Wochentag als Zahl ausgegeben, das ist unmissverständlich.

{
        $zeitpunkt = $zeitpunkt + 86400*2;

Das ist auch nicht richtig. Es gibt zwei bis drei Tage im Jahr, die nicht genau 86400 Sekunden lang sind; an diesen Tagen wird sich deine Funktion möglicherweise um einen Tag verrechnen.

Wenn du Tage addieren möchtest, dann addiere Tage und nicht Sekunden. In Javascript hilft das Date-Objekt beim Rechnen (wurde schon angemerkt), in PHP in gleicher Weise mktime(), alternativ DateTime::add().

Zum Problem:
Ich täte an deiner Stelle erstmal die x Tage addieren, dann schauen, wie viele Wochenenden in x Tagen vorhanden sein müssen (auf alle fünf Tage folgt ein Wochenende) und entsprechend Anzahl Wochenenden * 2 Tage hinzuaddieren.
Da wir auch an einem Wochenende starten könnten, ist als Startwert der nächste Montag zu wählen.

In Javascript:

function addiereWochentage(tage) {  
  var heute = new Date();  
  var korrektur = 0; // Korrekturtage für Start am Sonnabend oder Sonntag  
  if (heute.getDay() == 6) { // Sonnabend  
     korrektur += 2  
  }  
  else if (heute.getDay() == 0) { // Sonntag  
     korrektur += 1  
  }  
  return new Date(heute.getFullYear(), heute.getMonth(), heute.getDate() + korrektur + tage + Math.floor(tage / 5) * 2);  
}

Prüfen:

var wtage = Array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa");  
for (var i = 0; i < 40; i+= 1) {  
  var z = addiereWochentage(i);  
  console.debug(i, wtage[z.getDay()], z);  
}  

0 Mo Date {Mon Jan 13 2014 00:00:00 GMT+0100 (CET)}
1 Di Date {Tue Jan 14 2014 00:00:00 GMT+0100 (CET)}
2 Mi Date {Wed Jan 15 2014 00:00:00 GMT+0100 (CET)}
3 Do Date {Thu Jan 16 2014 00:00:00 GMT+0100 (CET)}
4 Fr Date {Fri Jan 17 2014 00:00:00 GMT+0100 (CET)}
5 Mo Date {Mon Jan 20 2014 00:00:00 GMT+0100 (CET)}
6 Di Date {Tue Jan 21 2014 00:00:00 GMT+0100 (CET)}
7 Mi Date {Wed Jan 22 2014 00:00:00 GMT+0100 (CET)}
8 Do Date {Thu Jan 23 2014 00:00:00 GMT+0100 (CET)}
9 Fr Date {Fri Jan 24 2014 00:00:00 GMT+0100 (CET)}
10 Mo Date {Mon Jan 27 2014 00:00:00 GMT+0100 (CET)}
11 Di Date {Tue Jan 28 2014 00:00:00 GMT+0100 (CET)}
12 Mi Date {Wed Jan 29 2014 00:00:00 GMT+0100 (CET)}
13 Do Date {Thu Jan 30 2014 00:00:00 GMT+0100 (CET)}
14 Fr Date {Fri Jan 31 2014 00:00:00 GMT+0100 (CET)}
15 Mo Date {Mon Feb 03 2014 00:00:00 GMT+0100 (CET)}
16 Di Date {Tue Feb 04 2014 00:00:00 GMT+0100 (CET)}
17 Mi Date {Wed Feb 05 2014 00:00:00 GMT+0100 (CET)}
18 Do Date {Thu Feb 06 2014 00:00:00 GMT+0100 (CET)}
19 Fr Date {Fri Feb 07 2014 00:00:00 GMT+0100 (CET)}
20 Mo Date {Mon Feb 10 2014 00:00:00 GMT+0100 (CET)}
21 Di Date {Tue Feb 11 2014 00:00:00 GMT+0100 (CET)}
22 Mi Date {Wed Feb 12 2014 00:00:00 GMT+0100 (CET)}
23 Do Date {Thu Feb 13 2014 00:00:00 GMT+0100 (CET)}
24 Fr Date {Fri Feb 14 2014 00:00:00 GMT+0100 (CET)}
25 Mo Date {Mon Feb 17 2014 00:00:00 GMT+0100 (CET)}
26 Di Date {Tue Feb 18 2014 00:00:00 GMT+0100 (CET)}
27 Mi Date {Wed Feb 19 2014 00:00:00 GMT+0100 (CET)}
28 Do Date {Thu Feb 20 2014 00:00:00 GMT+0100 (CET)}
29 Fr Date {Fri Feb 21 2014 00:00:00 GMT+0100 (CET)}
30 Mo Date {Mon Feb 24 2014 00:00:00 GMT+0100 (CET)}
31 Di Date {Tue Feb 25 2014 00:00:00 GMT+0100 (CET)}
32 Mi Date {Wed Feb 26 2014 00:00:00 GMT+0100 (CET)}
33 Do Date {Thu Feb 27 2014 00:00:00 GMT+0100 (CET)}
34 Fr Date {Fri Feb 28 2014 00:00:00 GMT+0100 (CET)}
35 Mo Date {Mon Mar 03 2014 00:00:00 GMT+0100 (CET)}
36 Di Date {Tue Mar 04 2014 00:00:00 GMT+0100 (CET)}
37 Mi Date {Wed Mar 05 2014 00:00:00 GMT+0100 (CET)}
38 Do Date {Thu Mar 06 2014 00:00:00 GMT+0100 (CET)}
39 Fr Date {Fri Mar 07 2014 00:00:00 GMT+0100 (CET)}