Announcement

Collapse
No announcement yet.

Kalenderwoche Algorithmus

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Kalenderwoche Algorithmus

    Hallo!

    Gibt es einen Algorithmus mit dem man die Kalenderwoche aus jedem beliebigen Datum errechnen kann?

    Gruss
    Olaf

  • #2
    Hallo, folgende Funktion könnte als Grundlage für eine eigene dienen:
    <p>int Kalenderwoche( PtDate&amp; rDate )<br>
    {<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PtDate aFirstYearDate( rDate.Year(), 1, 1 );<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PtDaysOfTheWeek aDay = aFirstYearDate.DayOfTheDate();<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long nDiff = rDate - aFirstYearDate;<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nLaengeErsteWoche = Sunday - aDay + 1;<br>
    <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( nLaengeErsteWoche &lt;= 3 )<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    // Wenn der erste Tag eines Jahres ein Freitag, Sonnabend oder Sonntag ist,<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    // dann rechnet dieser Wochenrest noch zum letzten Jahr.<br>
    <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    // wenn Differenz &lt;= 3 ist und die erste Woche nur drei Tage hat,<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    // dann ist es der 1., 2. oder 3. Januar. Die KW ist dann gleich der KW<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    // des 31.12. des vorhergehenden Jahres<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    if ( nDiff &lt;= Sunday - aDay ) return Kalenderwoche( PtDate( rDate.Year()-1, 12, 31 ) );<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( nDiff &lt; nLaengeErsteWoche ) return 1; // 1. Woche im Jahr<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    // prüfen, ob Tag in der letzen Woche des aktuellen Jahrs liegt<br>
    <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    PtDate aLastYearDate( rDate.Year(), 12, 31 );<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    aDay = aLastYearDate.DayOfTheDate();<br>
    <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    if ( aDay &lt; Thursday &amp;&amp; aLastYearDate - rDate &lt;= aDay )<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    {<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    // Wenn der erste Tag des folgenden Jahres ein kein Freitag, Sonnabend oder Sonntag ist,<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    // dann rechnet der Wochenanfang des alten Jahres schon zum neuen Jahr.<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    return 1;<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    }<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
    <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nKW = ( nDiff - nLaengeErsteWoche ) / 7 + 1; // KW ohne Berücksichtigung der ersten Woche berechnen<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( nLaengeErsteWoche > 3 ) ++nKW; // wenn die erste Woche zu rDate zählt<br>
    <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return nKW;<br>
    }<br>
    </p>
    &#10

    Comment


    • #3
      Vielen Dank.
      Nun bin ich schon um einiges schlauer.

      Gibts den evtl. auch noch ohne irgendeinen Bezug auf eine bestimmte Programmiersprache?

      Danke + Gruss
      Ola

      Comment


      • #4
        Hallo,

        habe das irgendwann einmal aus Pascal nach C++ übertragen. Das einzige jetzt noch spezifische ist der PtDate-Typ (für POET-Datenbank). Das sollte sich jedoch auch mit anderen Date-Typen realisieren lassen.

        Gruß Ud

        Comment


        • #5
          Für den C++Builder:

          TDateTime dtDate(iJahr,iMonat,iTag);

          unsigned short usYear,usMonth,usDay=0;

          dtDate.DecodeDate(&usYear,&usMonth,&usDay);

          int CalWeekNo=(int)((int)(dtDate-TDateTime(usYear,1,1)+1+(DayOfWeek(TDateTime(usYea r,1,1))%7)-3)/7)+1;

          if((CalWeekNo ==53)&&((DayOfWeek(TDateTime(usYear,12,31))-1)%7)<=3)

          CalWeekNo=1;

          return CalWeekNo
          Zuletzt editiert von Christian Marquardt; 08.01.2008, 22:49.
          Christian

          Comment


          • #6
            Schaut mal in die <DateUtils.hpp>. Da gibt's dann eine Funktion DecodeDateWeek() (oder so ähnlich, kann ich im Moment nicht prüfen), da übergibt man ein TDateTime und erhält das Jahr, die Woche und den Wochentag zurück.

            Joche

            Comment


            • #7
              Hallo,

              ich bin neu in diesem Forum habe aber schon gleich zwei Fragen.

              1. @ Jochen Reichenberg:
              Aus welchem Builder ist die <DateUtils.hpp>? Ich benutze den Borland Builder 5 Pro und da gibts die nicht.

              2. @ Christian Marquardt:
              Was sind iJahr, iMonat und iTag für Parameter? Wenn ich testweise für Jahr, Monat und Tag konstate Zahlen reinschreibe verursacht das eine Fehlermeldung.

              Vielleicht kann mir jemand helfen.

              Besten Dank schon mal.

              Comment


              • #8
                Hallo nochmal.

                Also die zweite Frage hat sich erledigt. Habe einfach mal in die Hilfe geschaut ;-)

                Comment


                • #9
                  Die DateUtils.hpp sollte im Ordner

                  .....\include\vcl

                  liegen, auch in der 5er Version. Dort gibt es auch entsprechende Funktionen:

                  http://www.marquardtnet.info/cecke/q...quicky_38.html

                  Was sind iJahr, iMonat und iTag für Parameter? Wenn ich testweise für Jahr, Monat und Tag konstate Zahlen reinschreibe verursacht das eine Fehlermeldung.
                  Aha, und was für eine?? Beim Compilieren? Beim Linken? Während des Ablaufes??

                  Ursache könnte sein, das der Quellcode hier im Beitrag etwas "verunstaltet" wurde:

                  TDateTime(usYea r,1

                  Warum hier die Variable mit einm Leerzeichen dargestellt wird kann ich nicht feststellen (und es läßt sich auch nicht berichtigen/ändern), aber aus dem Zusammenhang sollte ersichtlich sein, das das 'r' an das a kommt.

                  Ansonsten läuft die Routine einwandfrei, sofern man sie mit int Werten füttert
                  Christian

                  Comment


                  • #10
                    Originally posted by Christian Marquardt View Post
                    Die DateUtils.hpp sollte im Ordner

                    .....\include\vcl

                    liegen, auch in der 5er Version.
                    Nein, tut sie leider nicht, keine DateUtils.hpp vorhanden, definitiv nicht (BCB5 Pro).

                    Stehe just momentan vor demselben Problem mit den Kalenderwochen. Habe bisher die Ausgabe von strftime verwendet, aber %W liefert für 2008 einen zu niedrigen Wert. Suche daher nach einer anderen Lösung. Werde die oben gepostet mal ausprobieren.
                    Dirk

                    Comment


                    • #11
                      Originally posted by Christian Marquardt View Post
                      Die DateUtils.hpp sollte im Ordner

                      .....\include\vcl

                      liegen, auch in der 5er Version.
                      Nein, tut sie leider nicht, keine DateUtils.hpp vorhanden, definitiv nicht (BCB5 Pro).

                      Stehe just momentan vor demselben Problem mit den Kalenderwochen. Habe bisher die Ausgabe von strftime verwendet, aber %W liefert für 2008 einen zu niedrigen Wert. Suche daher nach einer anderen Lösung. Werde die oben gepostet mal ausprobieren.
                      Dirk

                      Comment


                      • #12
                        Kalenderwoche berechnen

                        Hi Christian,

                        ich habe auch die Version 5 Enterprise und will eigentlich nicht unbedingt was neueres kaufen. In dieser Version gibt dateutils.hpp nicht.
                        Die von dir gelieferte Funktion zur Berechnung der Kalenderwoche benutze ich auch schon seit Jahren, aber ich mußte gerade feststellen, daß Outlook hier wohl irgendwie anders rechnet. 2010 ist bis einschließlich 3.1 noch Kalenderwoche 53 des alten Jahres. Die erste Woche beginnt also am 4.1.2010. Die Funktion liefert da aber bereits die 2te Woche. Hast du dafür eine Erklärung ?

                        Bye - Peter

                        Comment


                        • #13
                          Die Funktion rechnet falsch, Outlook hat recht. Der erste Donnerstag des Jahres liegt in der KW 1, der erste Donnerstag war der 07.01.2010, 01.01. - 03.01. gehören zur KW 53 des letzten Jahres.

                          Ergänzung: Die Formel rechnet immer falsch, wenn der 01.01. auf einen Freitag fällt, so geschehen zuletzt 1999, nun in 2010, in Zukunft in 2016. Also flux ein "if (usYear==2010 || usYear==2016) { if (CalWeekNo>1) CalWeekNo--; }" einbauen und innerhalb der nächsten sechs Jahre eine bessere Formel bauen.
                          Zuletzt editiert von hgdorn; 17.06.2010, 14:19.
                          Dirk

                          Comment

                          Working...
                          X