MonatsErster/-Letzter



  • Hi,

    Wie kann ich den MonatsErsten ermitteln? 😕
    Wenn ich z.B. den 26.04.2004 habe, wie kann ich dann ohne großen Programmieraufwand den 01.04.2004 oder 30.04.2004 bekommen? Das soll natürlich für jeden beliebigen Monat möglich sein... 😉



  • ich versteh deine Frage nicht... 😕
    Der erste im Monat ist doch immer der 01. oder?
    Oder willst du wissen welcher Wochentag das ist oder so?

    gruss und muh! 😃



  • Also ich rate mal ein bissel.

    Als ersten Ansatz könntest Du die Tage 28/29/30/31 über Switch den Monaten zuordnen. Dann weißt Du, wieviel Tage der Monat hat. Ein Schaltjahr müßtest Du natürlich errechnen.
    Ein Schaltjahr ist übrigens immer durch 4 teilbar, mit zwei Ausnahmen:
    Es ist kein Schaltjahr, wenn es durch 100 teilbar ist (1900 war kein Schaltjahr).
    Es ist doch ein Schaltjahr, wenn es durch 1000 teilbar ist (deshalb war 2000 doch ein Schaltjahr).
    Aber das nur am rande. 😉

    Ich vermute mal, das Du damit schon was anfangen kannst.



  • Hm, stimmt. hab nicht grade ausführlich gesagt was ich will...

    Also nochmal von vorn!

    Ich habe in einer Datenbank Werte gespeichert. Diesen Werten haben ein Datum im Format yyyyddd (Jahr + Tag des Jahres -> 26.04.2004 = 2004117).
    Ich will jetzt die Werte aus der Datenbank auslesen, die im aktuellen Monat sind.
    Heute ist der 26.04., also will ich alle Werte vom April. Der Monat taucht aber im Datum nicht direkt auf, sondern nur Jahr und Tag des Jahres.

    Deswegen war mein erster Gedanke, dass ich versuche irgendwie den Monatsersten zu bekommen und dieses Datum dann in das Format yyyyddd umzuwandeln und dann über TimeSpan den Zeitraum bis zum Monatsletzten zu ermitteln.

    Aber wie kann ich diesen Monatsersten so ermitteln, dass ich das Format in das Format yyyyddd umwandeln kann? Ich will es vermeiden für jeden Tag einzeln eine Abfrage zu machen.
    Wie kann ich das Lösen??? 😕

    Noch Fragen offen???

    Ich danke schonmal für eure Hilfe! 😉



  • So, das sagt doch schon ein bissel mehr.
    Das was Du da hast ist ein "Julianische Kalender".
    Als Ansatz
    1. Tag rausparsen.
    2. if(Tag > 0 && Tag <=31)
    Monat = 1;
    if(Tag >31 && Tag <= 59)
    Monat = 2;
    usw.
    3. Denk ans Schaltjahr: Da ist dann der 60. Tag auch noch Februar.
    4. Wenn Du dann auch noch den genauen Tag haben möchtest
    if(Monat == 2)
    Tag - 31 = genauer_Tag;

    Ich denk, das sollte als Hilfe reichen. 😉



  • #define ISLEAPYEAR(year) ((!((year) % 4) && (year) % 100) || !((year) % 400))

    iMax = 31 - (iMonth == 4 || iMonth == 6 || iMonth == 9 || iMonth == 11) - (3*(iMonth == 2) - (iMonth==2)*ISLEAPYEAR(iYear));

    errechnet dir die maximale anzahl der tage in einem monat



  • @trikor:
    Bist Du sicher, dass Du den Julianischen Kalender meinst? Seit Papst Gregor haben wir den Gregorianischen Kalender. Seitdem sind die vollen Jahrhunderte keine Schaltjahre mehr, es sei denn, sie sind durch 400 teilbar.
    bSchlaumeierMode = FALSE; 😉

    Gruß T.



  • Theo schrieb:

    Bist Du sicher, dass Du den Julianischen Kalender meinst? Seit Papst Gregor haben wir den Gregorianischen Kalender. Seitdem sind die vollen Jahrhunderte keine Schaltjahre mehr, es sei denn, sie sind durch 400 teilbar.

    Natürlich bin ich sicher, das ich den Julianischen Kalender meine. Mir ist schon klar, dass wir derzeit den Gregorianischen Kalender haben. Ich bin ja nicht vor dem 4.Oktober 1582 geboren. 😃
    Ok, ich gebe zu, es handelt sich mehr um die Julianische Tageszählung als um den Julianischen Kalender. Bei der Bundeswehr wird er allerdings immer noch als Julianischer Kalender bezeichnet.
    Ansonsten habe ich mich lediglich bei einer Zahl beim Schaltjahr geirrt.
    Streiche 1000 setzte 400 (ja ich war auch mal beim Bund) 😃
    Das die vollen Jahrhunderte keine Schaltjahre sind hab ich geschrieben.

    Abgesehen davon geht es darum, den User auf den richtigen weg zu helfen.
    Daher
    👎

    Theo schrieb:

    bSchlaumeierMode = FALSE; 😉

    👎



  • Hallo LeByDo
    den ersten des aktuellen Monats bekommst du so:

    SYSTEMTIME st;
    ::GetLocalTime(&st);
    st.wDay = 1;

    Mit dem SYSTEMTIME-Objekt kannst du jetzt z.B. ein CTime-Objekt initialisieren:
    CTime t(&st);

    oder in andere Formate umrechnen, z.B. SystemTimeToFileTime wenn du die Zeit als FILETIME brauchst.



  • @trikor
    da hab ich ja wieder etwas dazugelernt. Ich kannte die Julianische Tageszählung bislang nicht. Dachte lediglich, Du hättest die Begriffe vertauscht. Sorry!

    Have a nice day! 🙂

    Gruß T.


Anmelden zum Antworten