Werktage zu einem Datum addieren

  • Hallo,
    ich möchte zu einem Datum eine bestimme Anzahl von Tagen addieren.
    Jedoch sollen nur Werktage addiert werden. (Mo-Fr).
    Das addierte Datum möchte ich anschließend ausgeben.
    Ich habe schon viel in der Doku rumgesucht und auch in Foren, finde aber
    nichts.
    Das Datumsformat ist momentan: date("d.m.Y") also 06.04.2009 für heute.

    Danke!

  • Soweit mir bekannt ist, gibt es da keine passende Funktion, da wirst du dir wohl selber etwas zusammenschreiben müssen.

  • ich würds so machen....

    - vom aktuellen datum den wochen tag holen (mit w)
    - tag (d) holen und tage draufzählen
    - schauen was zieldatum fürn wochentag hat
    - falls we dazwischen, 2 tage abziehen
    - prüfen ob monat gerade / ungerade oder 2 is
    - evtl monat "umbrechen"

  • Hallo,
    hab mir nun so ne Funktion geschrieben, aber das mit dem addieren
    von Mktime funktioniert noch nicht, da kommt irgendwas im Jahr 1930 raus.

    Danke

  • Mit einfachster Mathematik ist das zu lösen!

    Die Schleife könnte man auch noch optimieren, aber dazu habe ich jetzt keine Zeit/Lust

    Einmal editiert, zuletzt von bandit600 (6. April 2009 um 12:13)

  • edit: hoppla, war blödsinn

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Erledigt hatte die Überprüfung nach der Addition des Tages nicht sondern davor.

    Hallo,
    @ brandit deine Funktion hat bei meinem Einbau nicht richtig funktioniert,
    daher habe ich meine eigene umgebaut und bei deiner logische Schritte
    abgeguckt.

    Jedoch muss da noch irgendwo ein Denkfehler bei der Berechnung sein.
    Kann vielleicht nochmal jemand drauf schaun?

    Einmal editiert, zuletzt von Darkxor (6. April 2009 um 14:33)

  • Was funktioniert an meiner Version nicht?

    Diese Zeilen musst du bei dir vertauschen:

    PHP
    $tag = getdate($zeitpunkt);
    $zeitpunkt = $zeitpunkt + 86400;

    Richtig debuggen
    1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(E_ALL); und ini_set("display_errors", true);
    3. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    4. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde (oder auch nicht).
    5. Schritt 3 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
    6. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
    7. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    8. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.

  • Ungetestet, kommt aber mit weniger Schleifendurchläufen aus:

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

    Einmal editiert, zuletzt von SinnlosS (6. April 2009 um 14:55)

  • SinnlosS
    Ich glaube nicht (ohne es getestet zu haben), dass dein Script funktioniert, denn du hängst auch auf einem Sonntag 2 Tage dran. Und wo kommt $we her? ;)

  • Ups, $we kommt aus nem Projekt von mir das noch in Entwicklung ist und wo diese Funktion noch nicht getestet wurde, habe ich vergessen rauszustreichen.
    Das +2 am Sonntag passt aber schon, der Tag davor war dann ja ein Samstag der auch noch dazuaddiert werden muß, wenn ich mich grad nicht gänzlich vertue. ;)

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

    Einmal editiert, zuletzt von SinnlosS (6. April 2009 um 14:57)

  • Da darf mein Senf natürlich auch nicht fehlen :D

    Gruß crAzywuLf :D

    4 Mal editiert, zuletzt von crAzywuLf (6. April 2009 um 22:02)

  • Da darf mein Senf natürlich auch nicht fehlen :D


    Das sind zwar weniger Zeilen, es ist aber trotzdem wesentlich langsamer als meine Lösung, da du 7x soviele schleifendurchläufe brauchst:

    Ist zwar nur im Mikrosekunden-Bereich, aber läppert sich halt alles, je umfangreicher die Scripte werden.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

    2 Mal editiert, zuletzt von SinnlosS (9. April 2009 um 15:24)

  • Ok, mein Script liefert noch kein korrektes Ergebnis wie ich bei verschiedenen Tests festgestellt habe. Da ich das aber sowieso auch selber für ein umfangreiches Projekt brauche wo es mir auch auf die Laufzeit von Funktionen im Mikrosekundenbereich ankommt werde ich das noch korrigieren und hier dann posten.

    Wer nicht mit übermäßig hohen Werten arbeitet und/oder nur niedrige Zugriffszahlen auf die Funktion hat kann auf jedenfall die Lösung von Crazywulf auch gut nehmen.
    Ist in der Laufzeit halt länger, dafür weniger Zeilen Code was das Script übersichtlicher macht.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • So funktioniert es jetzt:

    PHP
    function get_enddate($start, $tage) {
        $wochen   = floor($tage / 5);
        $rest     = $tage % 5;
        $tage    += ($wochen * 2);
        $ende     = $start + ($tage * 86400);
        $ende    += (date("w", $ende)==6 || !date("w",$ende) || (date("w",$ende)-$rest)<1) ? 172800 : 0;
        return $ende;
    }

    Wichtig ist aber, dass man zur Berechnung des Start-Timestamps mit mktime() als Parameter für die Stunden 1 übergibt, und nicht 0. Ansonsten fehlt in der Winterzeit aufgrund der Zeitumstellung ein Tag.

    edit:
    Und wie ich gerade erfahren habe geht es noch viel einfacher mittels:

    PHP
    function get_enddate($start, $tage) {
      return strtotime('+'.((int)$tage).' weekday',(int)$start);
    }

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

    Einmal editiert, zuletzt von SinnlosS (14. April 2009 um 11:34)

  • Ich habe auch Senf! :D

    PHP
    function getEndDate($start, $tage)
    {
      $w = date('w', $start);
      $start += 86400 * floor($tage + (($w + $tage) / 7));
      return $start;
    }


    Wer braucht schon mktime, Schleifen und strtotime? So gehts doch viel schneller! :mrgreen:

    Viele liebe Grüße
    The User

  • Ich habe auch Senf! :D

    PHP
    function getEndDate($start, $tage)
    {
      $w = date('w', $start);
      $start += 86400 * floor($tage + (($w + $tage) / 7));
      return $start;
    }

    Wer braucht schon mktime, Schleifen und strtotime? So gehts doch viel schneller! :mrgreen:

    Viele liebe Grüße
    The User


    Laufzeit deiner Lösung hab ich jetzt noch nicht getestet. Es werden aber völlig falsche Ergebnisse geliefert. :)

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Hm nee, als Werktage zählen offiziell meines Wissens nur Mo-Fr.
    Ich checke glaub grad erst deinen Code, hatte gar nicht gesehen, dass du da halt mit 6 Werktagen die Woche rechnest und die Ergebnisse deshalb anders sind.
    Ich finde aber die strtotime-Variante trotzdem noch ansprechender. Kürzer als eine Zeile geht halt nicht. Werde ich morgen am andern Rechner mal noch auf Laufzeit testen, wie schnell das ist.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Was glaubst du, warum auf Fahrplänen steht "Werktags außer Samstag" oder die Post auch am Samstag kommt? :mrgreen:
    Das sieht vielleicht kurz aus, ist aber mit einem sehr hohen Aufwand verbunden. Solche Funktionen oder auch reguläre Ausdrücke sollte man vermeiden, da sie zur Laufzeit einen unnötigen Aufwand für die Analyse der Ausdrücke mitbringen.

    Viele liebe Grüße
    The User