Mit Datum rechnen



  • WebFritzi schrieb:

    Hmmm, und was machen, wenn sysTime.wDay == 1 ist? Ich hab da zu Hause so ne Datumsklasse. Kann ich hier mal posten, wenn du magst. Ich muss nur dran denken... 🙄

    jajaja, das war ja auch nur ein abstraktes Beispiel...find die Fragestellung nach wie vor etwas 'seltsam'...

    Aber: ➡
    Poste die mal sowas kann ich nämlich janz guht gebrauchen...würde dir das was ausmachen ? 🙂


  • Mod

    Mit COleDateTime/COledateTimeSpan lässt sich sehr einfach rechnen. Diese Klasse sind Bestandteil der ATL und basieren auf dem Win32 API typ DATE (double).



  • class date {
    
        friend ostream& operator<<( ostream &os, date &d );
        friend istream& operator<<( istream &is, date &d );
    
        private:
    
            bool valid;
            char seperator;
            unsigned short day;
            unsigned short month;
            unsigned short year;
    
        static bool is_leap_year( unsigned short y );
    
        public:
    
            date( );
            date( const date &d );
            date( unsigned short d, unsigned short m, unsigned short y );
            date( string str );
            bool is_valid( ) const;
            date& operator=( const date &d );
    };
    
    ostream& operator<<( ostream &os, date &d )
    {
        if( !d.valid )
            return os << "date not valid!";
    
        os.width( 2 );
        os.fill( '0' );
        os << d.day << d.seperator;
    
        os.width( 2 );
        os.fill( '0' );
        os << d.month << d.seperator;
    
        os.width( 4 );
        os.fill( '0' );
        os << d.year;
    
        return os;
    }
    
    istream& operator>>( istream &is, date &d )
    {
        unsigned short day;
        unsigned short month;
        unsigned short year;
    
        cout << "Day:   "; is >> day;
        cout << "Month: "; is >> month;
        cout << "Year:  "; is >> year;
    
        d = date( day, month, year );
    
        return is;
    }
    
    bool date::is_leap_year( unsigned short y )
    {
        if( ( y % 100 ) == 0 ) {
            if( ( y % 400 ) == 0 )
                return true;
    
            return false;
        }
    
        if( ( y % 4 ) == 0 )
            return true;
    
        return false;
    }
    
    date::date( ) : valid( false ), seperator( '.' ), day( 0 ), month( 0 ), year( 0 )
    {
    }
    
    date::date( const date &d )
    {
        day       = d.day;
        month     = d.month;
        year      = d.year;
        valid     = d.valid;
        seperator = d.seperator;
    }
    
    date::date( unsigned short d, unsigned short m, unsigned short y ) : valid( false ), seperator( '.' )
    {
        if( m < 1 || m > 12 || y < 1582 || !d )
            return;
    
        unsigned short days[ 12 ] = { 31, 00, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    
        days[ 1 ] = is_leap_year( y ) ? 29 : 28;
    
        if( d > days[ m - 1 ] )
            return;
    
        day   = d;
        month = m;
        year  = y;
    
        valid = true;
    }
    
    bool date::is_valid( ) const
    {
        return valid;
    }
    
    date& date::operator=( const date &d )
    {
        day       = d.day;
        month     = d.month;
        year      = d.year;
        valid     = d.valid;
        seperator = d.seperator;
    
        return *this;
    }
    

    viel Spaß beim Erweitern 😉

    Greetz, Swordfish



  • Hallo Greetz Swordfish,

    so etwas möchte ich gerade vermeiden .
    Es gibt eine andere Möglichkeit : Das Datum in long umwandeln , damit rechnen und dann wieder zurück .
    ich habe noch nicht herausgefunden wie das geht...

    Trotzdem , danke für deine Mühe.

    Mfg , Elke



  • Hallo Codefinder,

    Deine Frage is wirsch...

    Also du kannst doch das '1. Datum' in die SYSTEMSTRUKTUR schreiben...und dann damit rechnen...

    Meinetwegen auch:

    C/C++ Code:
    SYSTEMTIME sysTime;
    // Init
    // ...

    sysTime.wDay -= 1;

    Wenn ich es so gemacht hätte , dann wäre ich morgen arbeitslos .*g*

    Was mache ich denn , wenn das Jahr oder Monat sich ändern ? oder heute der 1 .
    ist ?

    Und wenn du die Frage nicht verstehst , versuche bitte nicht den Fragesteller
    als Blödmann abzustempeln.

    Mfg ,
    Elke



  • lol, na ok...wie du meinst...aber ich finde Swordfishs Klasse verdammt gut(für deinen Zweck 😃 )

    Elke100 schrieb:

    so etwas möchte ich gerade vermeiden .
    Es gibt eine andere Möglichkeit : Das Datum in long umwandeln , damit rechnen und dann wieder zurück .

    Na es geht doch: Du willst also nur ein Datum von einem String(std::string/C-String ? ) in eine long Variable umwandeln ?



  • Elke100 schrieb:

    Es gibt eine andere Möglichkeit : Das Datum in long umwandeln , damit rechnen und dann wieder zurück.
    ich habe noch nicht herausgefunden wie das geht...

    Mit in long umwandeln und damit rechnen wird nicht funktionieren. Schade das du ein ungläubiger bist. 😃

    Greetz Swordfish



  • Ich hab's doch nicht mehr. Sorry. 🙄

    @Elke: Was findste denn an Swordfishs Klasse nicht gut?



  • [opinion] Elke ist einfach zu faul um sie zu erweitern [/opinion]

    Greetz, Swordfish



  • Jetzt hackts halt nicht so auf der Elke rum.

    MfG,
    *Ranner*



  • Ich hack nicht auf Elke100 'rum, sondern spreche nur das offensichtliche aus.

    Greetz, Swordfish



  • Hallo Greetz, Swordfish ,

    bitte nicht gleich beleidigt sein. 😉
    Ich finde deine Lösung nicht schlecht , aber es gibt eine einfachere
    Lösung. Wenn ich sie habe , dann stelle ich sie hier unbedingt rein.

    Danke !

    Viele Grüße,
    Elke



  • @Elke100:

    Elke100 schrieb:

    bitte nicht gleich beleidigt sein. 😉

    Ich bin sicher nicht beleidigt, weil du dir nicht helfen lässt.

    Elke100 schrieb:

    Ich finde deine Lösung nicht schlecht , aber es gibt eine einfachere
    Lösung.

    Um mit einem Datum zu rechnen musst du die Anzahl der Monatstage und damit auch Schaltjahre berücksichtigen. Da führt kein Weg daran vorbei. Es kann natürlich sein, dass du eine fertige OpenSource Klasse findest - ich finde jedoch, für so ein einfach zu lösendes Problem ist die Suche nach einer fertigen Klasse aufwändiger, da du sie gegebenenfalls noch für dich anpassen musst.
    Also: Good Luck... 😃

    Greetz, Swordfish



  • Ich weiß zwar nicht ob es das ist was du suchst, aber das wäre eine Möglichkeit mit dem Datum zu rechnen.

    UINT64 one_day = 24 * 60 * 60 * 10000000;
    
    SYSTEMTIME st;
    GetLocalTime(&st); // heutiges datum holen
    
    FILETIME ft;
    SystemTimeToFileTime(&st,&ft); // umwandeln in FILETIME
    
    UINT64 * tmptime = reinterpret_cast<UINT64*>(&ft); 
    
    *tmptime -= one_day; // Einen Tag abziehen
    
    FileTimeToSystemTime(&ft,&st); // Wieder in SYSTEMTIME konvertieren
    
    // Jetzt kannst du einfach das SYSTEMTIME Objekt st abfragen 
    std::cout << "Gestern war der " << st.wDay << "." << st.wMonth << "." << st.wYear << std::endl;
    

    BR



  • Swordfish schrieb:

    @Elke100:
    Um mit einem Datum zu rechnen musst du die Anzahl der Monatstage und damit auch Schaltjahre berücksichtigen. Da führt kein Weg daran vorbei. Es kann natürlich sein, dass du eine fertige OpenSource Klasse findest - ich finde jedoch, für so ein einfach zu lösendes Problem ist die Suche nach einer fertigen Klasse aufwändiger, da du sie gegebenenfalls noch für dich anpassen musst.
    Also: Good Luck... 😃

    Greetz, Swordfish

    Siehe vorheriger Post von mir. Mit Hilfe der WinAPI geht das auch so 😉

    Ansonsten kann man sich auch mal Boost.Date_Time anschauen 😉

    BR



  • Hallo evilissimo,

    deine Lösung gefällt mir sehr gut. Ich muss sie mir merken 😉

    Ich habe meine Lösung jetzt im C++ Forum unter < Rechnen mit Datum >
    gepostet. 🙂

    Danke euch allen für eure Hilfe.

    Viele Grüße,
    Elke


Anmelden zum Antworten