long timestamp to SYSTEMTIME
-
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?
-
plizer schrieb:
(und warum gibt es so einen Datentypen überhaupt, wenn es schon zig andere gibt?)
Weil es im Standard keinen echten 64-bit Datentyp gibt z.B.?
Der MS-Compiler müsste mit unsigned long long klarkommen. Aber ULARGE_INTEGER könnte imho auch eine Struktur mit zwei unsigned int Feldern sein, dann lassen sie sich zumindest nicht direkt zuweisen.
-
Es ist eine Union die beides enthält. unsigned long long und eine struct mit zwei int.
-
Ok, das könnt ein Grund sein ;-).
Bei unsigned long long meckert der Compiler. Das ULARGE_INTEGER ist eine union. Dachte auch die könnte man zuweisen. Muss mal schauen wie das dann anders geht...
-
@Braunstein: Danke. Ich habe einen int-Wert und den will ich dem ULARGE_INTEGER zuweisen. Was muss ich da denn dann genau machen (ich glaube ich werde C++ nie verstehen)?
-
Entweder direkt an li.QuadPart zuweisen oder an li.u.LowPart (im letzteren Fall mußt du HighPart auf Null setzen):
int i = 4711; ULARGE_INTEGER li; //a: li.QuadPart = i; //b: li.u.LowPart = i;//oder li.LowPart=i li.u.HighPart = 0;//oder li.HighPart=0
-
Meine Methode sieht jetzt so aus:
SYSTEMTIME CMainDlg :: systemtimeReduzieren(SYSTEMTIME datetime, int reduzierungAnzahlVonSekunden) { // Deine Daten SYSTEMTIME sys_time; ULARGE_INTEGER time_to_subtract; time_to_subtract.QuadPart = reduzierungAnzahlVonSekunden; union { FILETIME ft; ULARGE_INTEGER ts; } t; SystemTimeToFileTime( &datetime, &t.ft ); t.ts -= time_to_subtract; FileTimeToSystemTime( &t.ft, &sys_time ); return sys_time; }
Dann meckert allerdings der Compiler folgendermaßen:
error C2676: Binaerer Operator '-=' : 'union _ULARGE_INTEGER' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht
-
Du könntest es so machen
t.ts.QuadPart -= time_to_subtract;
-
Du mußt auch zum subtrahieren auf den richtigen Teil der Union zugreifen
(t.ts.QuadPart-=reduzierung;)
(übrigens steht in FILETIME keine Sekunden-Angabe, sondern "the number of 100-nanosecond units since the beginning of January 1, 1601." (Zitat aus der MSDN), d.h. um auf ein vernünftiges Ergebnis zu kommen, mußt du den Reduzierungs-Wert noch mit 10000000 multiplizieren)
-
Um hier nochmal eine Lanze zu brechen: Das alles hat rein garnichts damit zu tun, dass Du C++ nie verstehen werden könntest, das hat noch nichtmal was mit C++ an sich zu tun. Wäre ULARGE_INTEGER eine schöne C++-Klasse, hätte sie (hoffentlich :D) Zuweisungs- und Rechenoperatoren, die sich benutzen liessen wie Du es hier versuchst. Nur leider ist ULARGE_INTEGER ein WinAPI-Bestandteil und damit übelstes C...
-
Vielen Dank!
Jetzt bekomme ich die Methode allerdings nicht aufgerufen, hab schon 10-20 verschiedene Varianten versucht.
Versuch des Aufrufs:SYSTEMTIME *datumZeitEnde = new SYSTEMTIME; GetLocalTime(datumZeitEnde); SYSTEMTIME d = systemtimeReduzieren(datumZeitEnde, getTaktAnzahlSekunden());
Er meckert dann immer mit:
error C2664: 'systemtimeReduzieren' : Konvertierung des Parameters 1 von 'struct _SYSTEMTIME *' in 'struct _SYSTEMTIME' nicht moeglich
Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstruktors ist mehrdeutig
error C2511: 'struct _SYSTEMTIME __thiscall CMainDlg::systemtimeReduzieren(struct _SYSTEMTIME &,int)' : Überladene Member-Funktion nicht in '<unbekannt>' gefundenMethode:
SYSTEMTIME CMainDlg :: systemtimeReduzieren(SYSTEMTIME &datetime, int reduzierungAnzahlVonSekunden) { // Deine Daten SYSTEMTIME sys_time; ULARGE_INTEGER time_to_subtract; time_to_subtract.QuadPart = reduzierungAnzahlVonSekunden; union { FILETIME ft; ULARGE_INTEGER ts; } t; SystemTimeToFileTime(datetime, &t.ft ); t.ts.QuadPart -= (time_to_subtract * 10000000); FileTimeToSystemTime( &t.ft, &sys_time ); return sys_time; }
Wahrscheinlich nutze ich wieder & und * falsch. Aber das werde ich nie begreifen...
-
Du übergibst einen pointer wärend deine Funktion eine Referenz erwartet. Du brauchst hier auch gar keinen Pointer. Mach es doch so
SYSTEMTIME datumZeitEnde; GetLocalTime(&datumZeitEnde); SYSTEMTIME d = systemtimeReduzieren(datumZeitEnde, getTaktAnzahlSekunden());