COleDateTime: Problem mit Konstruktor und Gültigkeitsprüfung
-
Ich habe hier Klassen von Codeproject. Im Demo funktioniert es gut, im richtigen Projekt nicht mehr.
Nun habe ich glücklicherweise (komischerweise) neuerdings den Fehler auch im Debugmodus und kann ihn suchen.Folgende Zeilen habe ich aktuell im Verdacht:
bool CAMSEdit::DateBehavior::IsValidDay(int nDay) const { CLog::Melde("IsValidDay\n%d, %d, %d", GetValidYear(), GetValidMonth(), nDay); return IsWithinRange(COleDateTime(GetValidYear(), GetValidMonth(), nDay, 0, 0, 0)); }
Hier wird der Konstruktor mit 2005, 11, 31 gefüttert.
bool CAMSEdit::DateBehavior::IsWithinRange(const COleDateTime& date, bool /*= true*/) const { CLog::Melde("%b %s", (date.GetStatus() == COleDateTime::valid), date.Format(_T("%d.%m.%Y"))); return (date.GetStatus() == COleDateTime::valid && date >= m_dateMin && date <= m_dateMax); }
Hier wird mir der 01.12.2005 ausgegeben.
Der Konstruktor scheint automatisch zu wandeln - wie verhindere ich das? Oder wie kann man das sonst noch prüfen?
-
Google: site:msdn.microsoft.com COleDateTime - beim Konstruktor steht nichts dabei, wann ein Datumswert invalid ist. Aber bei SetDate() steht explizit dabei, daß Werte wie 30.2.0x als invalid angenommen werden.
-
In die MSDN hatte ich schon geguckt - der Autor des Codes wird sich ja seinen Teil gedacht haben.
Verstehe ich dich richtig, dass SetDate keine Wandlung macht, aber das Objekt hinterher invalid ist?SetDate wandelt auch.
CLog::Melde("IsValidDay\n%d, %d, %d", GetValidYear(), GetValidMonth(), nDay); // 31.11.2005 COleDateTime date; date.SetDate(GetValidYear(), GetValidMonth(), nDay); CLog::Melde("%b %s", (date.GetStatus() == COleDateTime::valid), date.Format(_T("%d.%m.%Y"))); // 01.12.2005
Und zurückgegeben wird, dass es gültig ist... jetzt ja, klasse.
-
estartu_de schrieb:
Verstehe ich dich richtig, dass SetDate keine Wandlung macht, aber das Objekt hinterher invalid ist?
So habe ich zumindest den Eintrag in der MSDN verstanden.
Wenn alle Stricke reißen, kannst du die Validitätsprüfung auch selber übernehmen: "if(nDay>GetMaxDay(Month)) return false;"
-
CStoll schrieb:
Wenn alle Stricke reißen, kannst du die Validitätsprüfung auch selber übernehmen: "if(nDay>GetMaxDay(Month)) return false;"
Sind ja schon gerissen.
Das GetMaxDay hilft aber schon mal für alles bis auf den 29.2., danke!Ich denk noch ne Runde nach.