2017-05-21 5 views
-1

Wie kann ich die Anzahl der Sekunden direkt aus einer FILETIME-Struktur festlegen und abrufen?Wie bekomme/setze ich und bekomme die Anzahl der Sekunden direkt von/auf einer FILETIME-Struktur?

Ohne eine API zu verwenden, möchte ich die Anzahl der Sekunden von/auf einer FILETIME-Struktur erhalten/festlegen.

Ist das möglich?

Ich habe versucht, mit etwas Mathe zu jonglieren, wie es geht, aber ich habe noch keine Formel gefunden.

+1

Anzahl der Sekunden von welcher Epoche? Versuchen Sie beispielsweise, einen Unix-Zeitstempel zu erhalten? – user4581301

+0

Ich versuche die Anzahl der Sekunden zu erhalten, die der Dateierstellungszeit entsprechen - die FILETIME-Struktur enthält diese Datei Erstellungszeit – Shuzheng

+1

Das Problem ist die Anzahl der Sekunden von wann? FILETIME erfasst die Zeit beginnend am 1. Januar 1601 in Schritten von 100 Nanosekunden. Auf Unix-basierten Systemen hingegen wird die Zeit in Sekunden seit dem 1. Januar 1970 aufgezeichnet. Excel und Tabellen verwenden eine andere Startzeit. NTP verwendet eine andere Startzeit. Jeder benutzt andere Startzeiten, weil niemand in der Lage ist, sich auf die beste Startzeit zu einigen. – user4581301

Antwort

0

Schau mal hier:

Eine Datei Zeit ist ein 64-Bit-Wert, der die Anzahl von 100-Nanosekunden-Intervallen darstellt, die seit 00.00 vergangen sind 1. Januar 1601 Koordinierte Weltzeit (UTC).

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724290.aspx

Um die Struktur in einen 64-Bit-Wert zu konvertieren, einfach beiden Teile zu einem __int64 kombinieren und integer divide dann von 10.000.000 (1 Sekunde hat 1 Milliarde Nanosekunden, oder 1E9, daher 100 -ns-Auflösung ist 1/100 davon oder 1E7).

FILETIME timeFile; 
__int64 Time = (__int64) timeFile.dwHighDateTime << 32 | timeFile.dwLowDateTime; 
int TimeSec = Time/10000000; 

Sie können ULARGE_INTEGER verwenden und Zugriff auf ihn über .QuadPart dieser Union aber Microsoft schlägt auch __int64 oder ULONGLONG zu verwenden. 64-Bit-Nummern sind ein bisschen chaotisch.


Wenn Sie den Wert von Sekunden als Fraktion in Bezug auf Minute benötigen, verwenden Modulo 60. Gleiche zu Minute und Stunde gilt, aber Vorsicht, dass FILTETIME ist UTC nicht Ortszeit. Um das Datum, den Monat und das Jahr zu extrahieren, wird es ein bisschen schwierig, nicht das klingt nicht danach.

Verwandte Themen