Wenn dies Ihr erster Besuch hier ist,
lesen Sie bitte zuerst die Hilfe - Häufig gestellte Fragen
durch. Sie müssen sich vermutlich registrieren,
bevor Sie Beiträge verfassen können. Klicken Sie oben auf 'Registrieren', um den Registrierungsprozess zu
starten. Sie können auch jetzt schon Beiträge lesen. Suchen Sie sich einfach das Forum aus, das Sie am meisten
interessiert.
Hallo, folgende Funktion könnte als Grundlage für eine eigene dienen:
<p>int Kalenderwoche( PtDate& rDate )<br>
{<br>
PtDate aFirstYearDate( rDate.Year(), 1, 1 );<br>
PtDaysOfTheWeek aDay = aFirstYearDate.DayOfTheDate();<br>
long nDiff = rDate - aFirstYearDate;<br>
int nLaengeErsteWoche = Sunday - aDay + 1;<br>
<br>
if ( nLaengeErsteWoche <= 3 )<br>
{<br>
&n bsp;
// Wenn der erste Tag eines Jahres ein Freitag, Sonnabend oder Sonntag ist,<br>
&n bsp;
// dann rechnet dieser Wochenrest noch zum letzten Jahr.<br>
<br>
&n bsp;
// wenn Differenz <= 3 ist und die erste Woche nur drei Tage hat,<br>
&n bsp;
// dann ist es der 1., 2. oder 3. Januar. Die KW ist dann gleich der KW<br>
&n bsp;
// des 31.12. des vorhergehenden Jahres<br>
&n bsp;
if ( nDiff <= Sunday - aDay ) return Kalenderwoche( PtDate( rDate.Year()-1, 12, 31 ) );<br>
}<br>
else<br>
if ( nDiff < nLaengeErsteWoche ) return 1; // 1. Woche im Jahr<br>
else<br>
{<br>
&n bsp;
// prüfen, ob Tag in der letzen Woche des aktuellen Jahrs liegt<br>
<br>
&n bsp;
PtDate aLastYearDate( rDate.Year(), 12, 31 );<br>
&n bsp;
aDay = aLastYearDate.DayOfTheDate();<br>
<br>
&n bsp;
if ( aDay < Thursday && aLastYearDate - rDate <= aDay )<br>
&n bsp;
{<br>
&n bsp; &nbs p;
// Wenn der erste Tag des folgenden Jahres ein kein Freitag, Sonnabend oder Sonntag ist,<br>
&n bsp; &nbs p;
// dann rechnet der Wochenanfang des alten Jahres schon zum neuen Jahr.<br>
&n bsp; &nbs p;
return 1;<br>
&n bsp;
}<br>
}<br>
<br>
int nKW = ( nDiff - nLaengeErsteWoche ) / 7 + 1; // KW ohne Berücksichtigung der ersten Woche berechnen<br>
if ( nLaengeErsteWoche > 3 ) ++nKW; // wenn die erste Woche zu rDate zählt<br>
<br>
return nKW;<br>
}<br>
</p>


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.
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.
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.
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
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.
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.
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 ?
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.
Comment