long timestamp to SYSTEMTIME
-
Um ein Datum in einen Timestamp umzuwandeln funktioniert diese Methode prima:
time_t CMainDlg::dateToTimestamp(int jahr, int monat, int tag, int stunde, int minute, int sekunde) { time_t time_as_sec; struct tm timestrct; timestrct.tm_year = jahr - 1900; // Jahr - 1900 timestrct.tm_mon = monat - 1; // Monat - 1; timestrct.tm_mday = tag; timestrct.tm_hour = stunde; timestrct.tm_min = minute; timestrct.tm_sec = sekunde; timestrct.tm_isdst = 0; time_as_sec = mktime(×trct); return time_as_sec; }
Jetzt brauch ich allerdings etwas anderes, aber ähnliches. Ich habe SYSTEMTIME vorliegen und muss davon eine bestimmte Zeit abziehen (z.B. 2 Stunden 10 Minuten und 15 Sekunden). Das SYSTEMTIME kann ich zwar als timestamp umwandeln und dann die Sekunden abziehen, so dass ich einen neuen Timestamp erhalte. Allerdings bekomme ich diesen Timestamp dann nicht mehr zurück in SYSTEMTIME umgewandelt!
Hat jemand eine Ahnung wie das funktioniert?
-
Gibt es niemanden der das Problem schonmal hatte?
-
Wieder mal so ein Beispiel, was man in Java in MINUTEN löst, aber mit C++ TAGE dran verbringen kann...
-
plizer schrieb:
Wieder mal so ein Beispiel, was man in Java in MINUTEN löst, aber mit C++ TAGE dran verbringen kann...
Vom Flamen geht's aber auch nicht schneller
Hat wohl ausserdem eher mit WinAPI als mit C++ zu tun, bzw. weitergefasst mit Interaktion zwischen WinAPI und C++...
-
Da bettelt aber einer um Aufmerksamkeit ....
Ich habe noch nie etwas mit "SYSTEMTIME" gemacht, deswegen kann ich Dir nicht helfen. Wir haben uns frühzeitig eine Lib zugelegt (hightime) und die macht alles für uns.
Gruß,
Simon2.
-
Ich werde das Programm jetzt so umbauen, dass ich die Umwandlung in der Datenbank machen werde (Stichwort: unix_timestamp). Besser als weitere Tage damit zu verbringen.
Aber danke für Eure Antworten...
-
Hallo,
Zur SYSTEMTIME kann man doch das hier finden
http://msdn2.microsoft.com/en-us/library/ms724950.aspx
Da steht unter anderem auch folgendesIt is not recommended that you add and subtract values from the SYSTEMTIME structure to obtain relative times. Instead, you should
* Convert the SYSTEMTIME structure to a FILETIME structure.
* Copy the resulting FILETIME structure to a ULARGE_INTEGER structure.
* Use normal 64-bit arithmetic on the ULARGE_INTEGER value.Was willst du mehr. Es gibt dann ja noch
FileTimeToSystemTime und SystemTimeToFileTime.
-
* Convert the SYSTEMTIME structure to a FILETIME structure.
* Copy the resulting FILETIME structure to a ULARGE_INTEGER structure.
* Use normal 64-bit arithmetic on the ULARGE_INTEGER value.Das wusste ich schon vor 2 Tagen.......
-
Und warum machst du es dann nicht so?
// Deine Daten SYSTEMTIME sys_time; ULARGE_INTEGER time_to_subtract; union { FILETIME ft; ULARGE_INTEGER ts; } t; SystemTimeToFileTime( &sys_time, &t.ft ); t.ts -= time_to_subtract; FileTimeToSystemTime( &t.ft, &sys_time );
-
Da gibts nur einen Grund. Ich bin da nicht drauf gekommen und wär ich wohl auch nicht.
Vielen Dank, werds gleich probieren!
PS: Und warum gibts im MSDN bei jedem Beispiel mind. 100 Zeilen Code? Das habe ich mich schon immer gefragt.
-
plizer schrieb:
PS: Und warum gibts im MSDN bei jedem Beispiel mind. 100 Zeilen Code? Das habe ich mich schon immer gefragt.
Damit man's besser versteht
Übrigens hab ich für den Code jetzt nur 12 Sekunden und keine 2 Tage gebraucht
Also doch besser als Java
PS: Und es geht mir genauso, wenn ich mal Java oder C# programmieren muss. Ich glaub das ist bei jedem Umstieg so
-
Badestrand schrieb:
PS: Und es geht mir genauso, wenn ich mal Java oder C# programmieren muss. Ich glaub das ist bei jedem Umstieg so
Sehe ich genauso. Ich habe neulich graue Haare bekommen als ich in Java mit Timestamps, Timespans und Calendars rumhantieren musste...
-
Hi,
auch als glühender C++-Verehrer muss ich aber zugeben, dass das Thema "Zeit/Datum" schon seeeehr schwach spezifiziert ist.
Da sollte beim nächsten Standard mal dringend nachgearbeitet werden.Gruß,
Simon2.
-
Hat jemand schon mal boost::date_time verwendet? Wie sind da die Erfahrungen?
-
Wird in dem Beispiel überhaupt die systemtime verändert?
SystemTimeToFileTime( &sys_time, &t.ft ); t.ts -= time_to_subtract; FileTimeToSystemTime( &t.ft, &sys_time );
Das ts wird zwar verändert, allerdings hat es doch nie was mit systemtime zu tun?!?
-
ts wird ja wieder nach SYSTEM_TIME konvertiert (das Ergebnis wird in sys_time gespeichert), in der dritten von dir zitierten Zeile
-
Badestrand schrieb:
ts wird ja wieder nach SYSTEM_TIME konvertiert (das Ergebnis wird in sys_time gespeichert), in der dritten von dir zitierten Zeile
Also, so sieht das aus:
// Deine Daten SYSTEMTIME sys_time; // z.B. 2007-10-10 10:00:00 ULARGE_INTEGER time_to_subtract; // z.B. 600, sind dann doch 600 Sekunden? union { FILETIME ft; ULARGE_INTEGER ts; } t; SystemTimeToFileTime( &sys_time, &t.ft ); // hier wird in ft genau das hier übernommen: 2007-10-10 10:00:00, natürlich ganz anders gespeichert, weil FILETIME ja anders arbeitet. t.ts -= time_to_subtract; // Das Attribut von der union t (ich hab noch nie union vorher gesehen) ts wird um 600 verringert. FileTimeToSystemTime( &t.ft, &sys_time ); // Wieso ist denn in t.ft jetzt das um 600 reduzierte Ergebnis drin?!?
-
Alle Elemente einer Union teilen sich den gleichen Speichplatz. Wenn als jetzt ts um 600 verringert wird ist ft automatisch auch um 600 verringert.
-
Braunstein schrieb:
Alle Elemente einer Union teilen sich den gleichen Speichplatz. Wenn als jetzt ts um 600 verringert wird ist ft automatisch auch um 600 verringert.
Aso! Alles klar. Das hatte ich noch gewusst, aber wusste nicht, dass das in der Praxis dann genau so aussieht! Danke!
-
Welche Zahlentyp ist eigentlich kompatibel zu ULARGE_INTEGER? (und warum gibt es so einen Datentypen überhaupt, wenn es schon zig andere gibt?)
Ich habe es mit:
int long unsigned int unsigned long
versucht. Aber da meckert überall der Compiler...
Jemand nen Tipp?