Roland: Datums-Berechnung - Termin wiederholt sich immer am ....

Hallo!

Wie kann ich bitte das Datum aller Tage innerhalb der nächsten
10 Jahre herausfinden, auf welche folgende Aussagen zutreffen:

Geht um die Berechnung zukünftiger Termine,
sowas ähnliches wie ein Kalender,
man muss jetzt schon sehen wann welches Event ist
damit auch überprüfbar ist was sich überschneidet.

Termin wiederholt sich....

* an jeden Mittwoch an ...
* an jedem Monats-Ersten
* an jedem ersten Mittwoch im Monat
* an jedem 2. Donnerstag,  (1. Woche und 3. Woche)
* an jedem 2. Donnerstag   (2. Woche und 4. Woche)
* jedes Jahr zu Ostern
* jedes Jahr zu Pfingsten

Besten Dank!
Roland

  1. Hi,

    * an jeden Mittwoch an ...

    Finde den ersten Mittwoch, und addiere fortlaufend 7*24*60*60 zum erhaltenen Timestamp.

    * an jedem Monats-Ersten

    Erzeuge fortlaufende Timestamps, indem du das Jahr fortlaufend und den Monat jeweils von 1..12 durchzählst.

    * an jedem ersten Mittwoch im Monat

    Verfahre wie im vorherigen Beispiel, bestimme den Wochentag des erhaltenen Timestamps und addiere die entsprechende Anzahl Tage dazu.

    * an jedem 2. Donnerstag,  (1. Woche und 3. Woche)

    Bestimme den ersten Donnerstag im Monat wie eben beschrieben, nimm den so erhaltenen Timestamp und den um zwei Wochen (=2*7*24*60*60s) weiter. Optional: Prüfe, ob es einen fünften Donnerstag im Monat gibt, und nimm den auch noch dazu.

    * an jedem 2. Donnerstag   (2. Woche und 4. Woche)

    Wie vorher, nimm aber dafür die Timestamps (1. Do im Monat + 1 Woche) und (1. Do im Monat + 3 Wochen).

    * jedes Jahr zu Ostern
    * jedes Jahr zu Pfingsten

    Da wird's kompliziert und astronomisch. Die Berechnung des Osterdatums, auf das sich sämtliche "beweglichen" kirchlichen Feiertage beziehen, ist aber auch nicht gar so wild.

    So long,
     Martin

    --
    Irgendwann in grauer Vorzeit benutzte einer unserer prähistorischen Vorfahren ein Schimpfwort anstelle der Keule.
    Die Zivilisation hatte begonnen.
    1. Hi,

      Finde den ersten Mittwoch, und addiere fortlaufend 7*24*60*60 zum erhaltenen Timestamp.

      Das solltest du doch besser wissen - Tage sind nicht immer 86400 Sekunden lang.

      MfG ChrisB

      --
      „This is the author's opinion, not necessarily that of Starbucks.“
      1. Hallo,

        Finde den ersten Mittwoch, und addiere fortlaufend 7*24*60*60 zum erhaltenen Timestamp.
        Das solltest du doch besser wissen - Tage sind nicht immer 86400 Sekunden lang.

        yo, hast Recht - im Prinzip weiß ich das, habe es aber hier tatsächlich nicht bedacht. Ist aber halb so wild, wenn man vom Zeitpunkt "zwölf Uhr mittags" ausgeht und tatsächlich nur das Datum braucht: Die Abweichungen durch Sommer/Winterzeit kompensieren sich im Lauf des Jahres, und die gelegentlichen Schaltsekunden werden auch auf Jahrhunderte nicht so zahlreich sein, dass sie einen halben Tag (und damit ein falsches Datum) ausmachen.

        Anscheinend kann man auch die Tage fortzählen, indem man den Parameter "day" in mktime() in die Tausende oder noch höher gehen lässt; zumindest meine Versuche bestätigten eben, dass die Timestamps wie erwartet berechnet werden, ebenso wie beim Date-Objekt in Javascript. Ich weiß aber nicht, ob dieses Verhalten auch für PHP dokumentiert ist, möchte mich also nicht darauf verlassen oder diesen "Trick" gar weiterempfehlen.

        Ciao,
         Martin

        --
        "Drogen machen gleichgültig."
         - "Na und? Mir doch egal."
        1. echo $begrüßung;

          Finde den ersten Mittwoch, und addiere fortlaufend 7*24*60*60 zum erhaltenen Timestamp.
          Das solltest du doch besser wissen - Tage sind nicht immer 86400 Sekunden lang.

          Sekunden anzugeben, ob berechnet oder als Absolutwert, ist zudem weniger schnell verständlich, wenn man nicht nebenher kommentiert, was die Berechnung in menschlichen Worten ergibt.

          yo, hast Recht - im Prinzip weiß ich das, habe es aber hier tatsächlich nicht bedacht. Ist aber halb so wild, wenn man vom Zeitpunkt "zwölf Uhr mittags" ausgeht und tatsächlich nur das Datum braucht:

          Von 12 Uhr mittags auszugehen ist aber nicht immer ohne Umrechnung möglich. Man muss bei gegebener Uhrzeit erstmal auf Mittag umrechnen und nach der Tagesaddition wieder zur korrekten Uhrzeit zurückfinden ... und da sind sie wieder: die Probleme mit dem Versatz an Schalttagen.

          Es gibt die UTC, die so etwas wie Sommerzeit nicht kennt. Die ist also immer einheitlich, nur die Differenz zur Ortszeit schwankt, was aber kein Problem ist, gibt es doch ausreichend Möglichkeiten in PHP, dies berücksichtigend umrechnen zu lassen. Andererseits gibt es auch Funktionen, die selbständig richtig rechnen, wenn man ihnen zu einem Zeitpunkt "+ 7 days" und ähnliche Konstrukte hinzurechnen lässt: strtotime().

          Anscheinend kann man auch die Tage fortzählen, indem man den Parameter "day" in mktime() in die Tausende oder noch höher gehen lässt; zumindest meine Versuche bestätigten eben, dass die Timestamps wie erwartet berechnet werden,

          Seltsam ... die Funktion mktime() verhält sich also wie im Handbuch beschrieben.

          Ich weiß aber nicht, ob dieses Verhalten auch für PHP dokumentiert ist, möchte mich also nicht darauf verlassen oder diesen "Trick" gar weiterempfehlen.

          Kannst du aber problemlos machen. Es gibt übrigens auch noch gmmktime() für UTC-Zeitwerte.

          echo "$verabschiedung $name";

          1. Hallo,

            Von 12 Uhr mittags auszugehen ist aber nicht immer ohne Umrechnung möglich.

            stimmt, der OP hatte aber eine klare Problemstellung, die ausschließlich nach einem Datum fragt, nicht aber nach einer Uhrzeit. Also kann ich die Parameter hour, minute, second einfach mit 12,0,0 vorgeben.

            Nebenbei bemerkt finde ich die Implementierung von mktime() sehr eigenartig im Hinblick auf die Parameter-Reihenfolge. Vor allem angesichts des möglichen Weglassens von hinten nach vorn wäre die Reihenfolge beginnend mit dem Jahr und endend mit den Sekunden irgendwie pfiffiger.

            Anscheinend kann man auch die Tage fortzählen, indem man den Parameter "day" in mktime() in die Tausende oder noch höher gehen lässt; zumindest meine Versuche bestätigten eben, dass die Timestamps wie erwartet berechnet werden,
            Seltsam ... die Funktion mktime() verhält sich also wie im Handbuch beschrieben.

            Nein, eigentlich nicht. Zunächst heißt es: "If the arguments are invalid, the function returns FALSE (before PHP 5.1 it returned -1)." Daraus habe ich gefolgert, dass mein Ansatz eigentlich nicht funktionieren dürfte und war überrascht, dass er es doch tat (PHP 5.0.1).
            Nur beim Example #1 wird erwähnt: "mktime() is useful for doing date arithmetic and validation, as it will automatically calculate the correct value for out-of-range input." Damit steht dieses Beispiel aber im Widerspruch zur technischen Beschreibung der Parameter und des Anwendungsbereichs weiter oben.

            So long,
             Martin

            --
            Lieber Blödeleien als blöde Laien.
            1. echo $begrüßung;

              stimmt, der OP hatte aber eine klare Problemstellung, die ausschließlich nach einem Datum fragt, nicht aber nach einer Uhrzeit. Also kann ich die Parameter hour, minute, second einfach mit 12,0,0 vorgeben.

              Du bist ja pingelig wie ein Computer. :-) Ich interpretierte hingegen in "Termin" ein Datum mit Uhrzeit, denn eine solche ist zwar bei "Termin" nicht immer im Spiel aber auch nicht niemals. Deshalb berücksichtigte ich auch diese Möglichkeit, obwohl sie nicht explizit da stand.

              Nebenbei bemerkt finde ich die Implementierung von mktime() sehr eigenartig im Hinblick auf die Parameter-Reihenfolge.

              Ja, besonders die Anordnung von Monat und Tag ist gewöhnungsbedürftig. Muss ein Amerikaner implementiert haben ...

              Vor allem angesichts des möglichen Weglassens von hinten nach vorn wäre die Reihenfolge beginnend mit dem Jahr und endend mit den Sekunden irgendwie pfiffiger.

              Kommt drauf an. Wenn ich von heute Uhrzeitangaben brauche ist die Reihenfolge so herum nützlicher.

              Anscheinend kann man auch die Tage fortzählen, indem man den Parameter "day" in mktime() in die Tausende oder noch höher gehen lässt; zumindest meine Versuche bestätigten eben, dass die Timestamps wie erwartet berechnet werden,
              Seltsam ... die Funktion mktime() verhält sich also wie im Handbuch beschrieben.
              Nein, eigentlich nicht.

              Das Verhalten hat die Funktion übrigens vom C-Pendant geerbt.

              Zunächst heißt es: "If the arguments are invalid, the function returns FALSE (before PHP 5.1 it returned -1)." Daraus habe ich gefolgert, dass mein Ansatz eigentlich nicht funktionieren dürfte und war überrascht, dass er es doch tat (PHP 5.0.1).

              Die Frage ist, was ist "invalid" in dem Fall? In der manpage zum C-mktime() steht zunächst auch für die Werte ein Wertebereich, ohne allerdings Daten wie den 30. Februar auszuschließen.

              Nebenbei: Deine Vorliebe für Museumsversionen lebst du auch bei PHP aus? :-)

              Nur beim Example #1 wird erwähnt: "mktime() is useful for doing date arithmetic and validation, as it will automatically calculate the correct value for out-of-range input." Damit steht dieses Beispiel aber im Widerspruch zur technischen Beschreibung der Parameter und des Anwendungsbereichs weiter oben.

              Auch hier kann man die Parallele zur manpage ziehen, dort ist diese Eigenschaft auch erst irgendwo im Fließtext erwähnt. Das rechtfertigt natürlich nicht, diese nicht unbedeutende Information nur als Zusatztext zu einem Beispiel zu erwähnen.

              echo "$verabschiedung $name";

              1. Hallo,

                Du bist ja pingelig wie ein Computer. :-)

                natürlich, nach über zwanzig Jahren intensiver Beschäftigung mit diesen Tierchen als ständigen Hausgenossen kein Wunder. ;-)

                Ich interpretierte hingegen in "Termin" ein Datum mit Uhrzeit, denn eine solche ist zwar bei "Termin" nicht immer im Spiel aber auch nicht niemals. Deshalb berücksichtigte ich auch diese Möglichkeit, obwohl sie nicht explizit da stand.

                Okay - ich hatte nur die Fragen nach den Mittwochen und Donnerstagen bewusst wahrgenommen.

                Vor allem angesichts des möglichen Weglassens von hinten nach vorn wäre die Reihenfolge beginnend mit dem Jahr und endend mit den Sekunden irgendwie pfiffiger.
                Kommt drauf an. Wenn ich von heute Uhrzeitangaben brauche ist die Reihenfolge so herum nützlicher.

                Sicher kann man immer Beispiele für oder gegen eine bestimmte Variante finden; mir erscheint es einfach logischer, die Parameter in der Reihenfolge ihrer Wertigkeit aufzuführen, so wie bei Zahlen auch die Wertigkeit der Ziffern von links nach rechts abnimmt.

                Zunächst heißt es: "If the arguments are invalid, the function returns FALSE (before PHP 5.1 it returned -1)."
                Die Frage ist, was ist "invalid" in dem Fall?

                Diese Information habe ich allerdings auch schon vermisst.

                ... und war überrascht, dass er es doch tat (PHP 5.0.1).
                Nebenbei: Deine Vorliebe für Museumsversionen lebst du auch bei PHP aus? :-)

                Das ist in diesem Fall keine Vorliebe, sondern Pragmatismus: Einmal eingerichtet, funktioniert, und gut is'. Wenn ich Apache und PHP auf dem nächsten Rechner neu einrichte, werde ich aller Voraussicht nach wieder die zu dem Zeitpunkt aktuellen Versionen nehmen.

                Das rechtfertigt natürlich nicht, diese nicht unbedeutende Information nur als Zusatztext zu einem Beispiel zu erwähnen.

                In diesem Punkt sind wir uns zumindest einig.

                Gute Nacht,
                 Martin

                --
                F: Was ist ekliger als ein angebissener Apfel mit einem Wurm drin?
                A: Ein angebissener Apfel mit einem halben Wurm.