Mit Datum rechnen
-
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