Datum aus String in eine Schleife einbauen
-
Hallo Liebe C++ Community,
ich habe einen String in der Form "26.04.2010" und möchte diesen in eine for-Schleife einbauen. Ziel ist es nach z.B. drei Schleifendurchläufen den 29.04.2010 als String wieder zu haben. Leider habe ich keinen brauchbaren Ansatz gefunden bzw. glaube ich eher, dass ich es eher nicht verstanden habe, denn bei jedem Versuch den Ansatz in VC++ 2008 umzusetzen ergibt eine Fehlermeldung.
Kann mir hier bitte jemand weiterhelfen.
Dankeschön
-
hallo,
zeig einfach mal deinen ansatz und die fehlermeldung
ansonsten schau dir mal die beiden funktionen localtime() und mktime() an. sind in der time.h / ctime enthalten.
-
Hey, das ging ja schnell..

hier mein derzeitiger Ansatz, der aber von vorne bis hinten kracht#include <ctime>
#include <iostream>using namespace std;
int main ()
{int i;
time_t rawtime;
struct tm * timeinfo;time (&rawtime);
timeinfo = localtime (&rawtime);for (i=timeinfo,i<= timeinfo+259200, i=i+86400)
{
cout << "Zeit: ", asctime (i)<< endl;
}
system ("Pause");
return 0;
}}
Die Idee dahinter wäre &rawtime durch ein Alternativdatum zu ersetzen, aber ich denke der Ansatz ist komplett falsch.
Ich scheitere komplett an der Konvertierung des Datumsstrings in ein rechenbares Datumsformat und wieder retour. Bin mir sicher, dass es eine viel einfachere Methode gibt das Problem zu lösen.
Danke schon mal vorab für die Hilfestellung
-
#include <ctime> #include <iostream> using namespace std; int main () { for(time_t time_counter=time(0), end_time=time_counter + 259200 ;time_counter<end_time; time_counter+=86400) { tm *timeinfo = localtime (&time_counter); cout << "Zeit: "<< asctime (timeinfo)<< endl; } return 0; }Fragen dazu oder herrscht Klarheit?
edit: Hab's noch etwas verschönert und end_time und time_counter gänzlich in die for-Schleife gezogen. Gibt keinen Grund, die Variablen auch außerhalb bekannt zu machen.
edit2: An die Standardexperten:
Ist eigentlich garantiert, dass beitime_t time_counter=time(0), end_time=time_counter + 259200alles in der richtigen Reihenfolge ausgewertet wird? Das Komma ist doch keine Sequenzpunkt, oder? Sollte ich daher bessertime_t time_counter=time(0), end_time=time(0) + 259200schreiben?
-
Danke für die schnelle Antwort. Funktioniert wunderbar und ist auch schon implementiert

Ausgehend von meiner im ersten Post erwähnten Problemstellung möchte ich die komplette Lösung auch nicht vorenthalten.#include <ctime> #include <string> #include <iostream> using namespace std; int SekSeitNeunzehnhundertsiebzig (int , int , int ); int StringToInt(string); int main () { string date="14.03.2012"; string jahr; string monat; string tag; tag = date.substr(0,2); monat = date.substr(3,2); jahr = date.substr(6,4); int tagINT; int monatINT; int jahrINT; tagINT=StringToInt(tag); monatINT=StringToInt(monat); jahrINT=StringToInt(jahr); int sekunden; sekunden = SekSeitNeunzehnhundertsiebzig (jahrINT, monatINT, tagINT); cout << sekunden << endl; for(time_t time_counter=sekunden, end_time=time_counter + 259200 ;time_counter<end_time; time_counter+=86400) { tm *timeinfo = localtime (&time_counter); cout << "Zeit: "<< asctime (timeinfo)<< endl; } //return 0; system ("Pause"); } int SekSeitNeunzehnhundertsiebzig (int jahr, int monat, int tag) { int sek; int i; int flag; sek=0; flag=3; for (i=1970; i<jahr; i++) { if ( ( (i%4==0) && (i%100!=0) ) || (i%400==0) ) { // Schaltjahr sek = sek + 366*24*60*60; flag=1; } else { // kein Schaltjahr sek = sek + 365*24*60*60; flag=0; } }; if (monat > 1) { for (i=1; i<monat; i++) { switch (i) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: sek = sek + 31*24*60*60; break; case 4: case 6: case 9: case 11: sek = sek + 30*24*60*60; break; } if (i==2 && flag==1) { sek = sek + 29*24*60*60; } if (i==2 && flag==0) { sek = sek + 28*24*60*60; } } } sek = sek + (tag-1)*24*60*60; return sek; } int StringToInt(string strConvert) { int intReturn; intReturn = atoi(strConvert.c_str()); return(intReturn); }Eine abschließende Frage habe ich aber noch.
Wie kann ich das Ergebnis ( asctime (timeinfo) ) wieder in einen string in Form von z.B. "12.03.2010" generieren?Danke für die tolle Hilfe

-
schreima schrieb:
Wie kann ich das Ergebnis ( asctime (timeinfo) ) wieder in einen string in Form von z.B. "12.03.2010" generieren?
In dem du die richtige Funktion verwendest:
http://www.cplusplus.com/reference/clibrary/ctime/strftime/Grüssli
-
Wieso das umständliche SekSeitNeunzehnhundertsiebzig ?
Schau dir mal mktime aus <ctime> an. Du kannst mit deinen Werten einfach ein tm-struct befüllen und daraus mit mktime dein time_t machen.
-
ui, schoin wieder ein date_time Beitrag.

#include <iostream> #include "boost/date_time/gregorian/gregorian.hpp" int main() { using namespace std; using namespace boost::gregorian; date d(2002,Jan,1); for(int i=0; i<3; ++i) cout << (d += days(1)) << "\n"; // oder: zeig mir jeden 2.tag bis ende januar date end(2002,Jan,gregorian_calendar::end_of_month_day(2002,Jan)); for(day_iterator i(d,2);i <= end; ++i) cout << *i << "\n"; cin.get(); return 0; }
-
@ Dravere Danke für den Tipp -> genau das was ich gesucht habe.
@ pumuckl mktime usw. habe ich mir schon mal angesehen, bin auch überzeugt, dass es funktioniert, nur hab ichs zu meiner Schande nicht verstanden.
Zu meiner Verteidigung, ich beschäftige mich erst seit 3 Wochen mit C++.
@brotbernd habe diesen Ansatz auch probiert, bekomme aber folgende Fehlermeldung:
fatal error C1083: Datei (Include) kann nicht geöffnet werden: "boost/date_time/gregorian/gregorian": No such file or directoryhabs auch mit dem .hpp nach gregorian versucht, aber mit dem selben ergebnis.
jedenfalls vielen dank für eure hilfe.
-
[quote="schreima"] "boost/date_time/gregorian/gregorian": No such file or directory
quote]Du benötigst dazu die boost Bibliothek. Das ist für C++ Programmierer sowas wie die zweite Standardbibliothek. Kannst Du für VC++ bequem herunterladen:
http://www.boostpro.com/download