2012-04-03 4 views
4

Ich erstelle ein Mock-Objekt, um meine Anwendung zu testen, so dass es unter den Randbedingungen der Zeit funktioniert. Ich verwende FILETIME im Windows SDK.Spätestmögliche FILETIME

Der Link zeigt die früheste Zeit, die der 1. Januar 1601 ist (ich nehme Mitternacht 00:00:00 und beide dwLowDateTime und dwHighDateTime sind 0x00000000), also habe ich das. Was ist die letzte mögliche FILETIME?

Mein erster Instinkt ist, dwLowDateTime und dwHighDateTime auf 0xFFFFFFFF zu setzen, aber dann fragte ich, ob das wirklich eine gültige Zeit ist, die ich testen muss, da die SetFileTime-Funktion 0xFFFFFFFF verwendet, um den vorherigen Zugriff einer Datei anzugeben Zeit sollte erhalten bleiben.

+0

Wenn Sie Informationen über Dateiänderungen speichern möchten, sollten Sie die Änderungen nicht vor der aktuellen Zeit beschränken? Es macht keinen Sinn, in der Zukunft eine letzte modifizierte Zeit zu haben. – twain249

+0

@ tmain249 Ich könnte natürlich die aktuelle Zeit verwenden, und das würde funktionieren, wenn meine Frage nicht beantwortet wird. Danke für den Kommentar. Ich teste gerade aufgezeichnete Videos wie eine Überwachungskamera, die natürlich einen Zeitstempel für jeden Frame benötigt. – Aura

Antwort

7

Für diejenigen, die immer noch an der FILETIME Grenze interessiert sind: Meines Wissens ist, dass FILETIME gemacht wurde, um eine gültige SYSTEMTIME in 64 Bits darzustellen. Wenn Sie das Limit von SYSTEMTIME (letzte Millisekunde in 30827) nehmen, dann enden Sie mit FILETIME von 0x7fff35f4f06c58f0 mit SystemTimeToFileTime(). Wenn Sie 0x7fffffffffffffff in FileTimeToSystemTime() setzen, werden Sie jedoch in dem Jahr 30828 enden, obwohl dieses Datum für SYSTEMTIME ungültig ist. Jeder größere Wert (0x8000000000000000 und höher) führt dazu, dass FileTimeToSystemTime() fehlschlägt. Alles in allem würde ich empfehlen, nicht über 0x7fff35f4f06c58f0 hinauszugehen, um mit SYSTEMTIME kompatibel zu bleiben.

+1

Laut dem Patent von @NickShaw hat die FILETIME eine Reichweite von +/- 30.000 Jahren seit ihrer Epoche von 1601. Der tatsächliche Bereich ist jedoch nur +/- 29.227 (und einige Slop) aus der Epoche. Und SYSTEMTIME soll von Jahr 0 bis 65.535 sein. Microsoft hat sich also nicht die Mühe gemacht, genau zu implementieren, was sie patentieren ließen. :) –

1

Nach dem Link, FILE repräsentiert:

... die Anzahl der 100-Nanosekunden-Intervalle seit 1. Januar 1601 (UTC).

so nicht 1. JANUAR 1970

Er sagt auch,

... die SetFileTime Funktion [zum Beispiel] 0xFFFFFFFF verwendet, um festzulegen, dass sollte eine vorherige Zugriffszeit der Datei erhalten bleiben.

Also ich glaube nicht, dass Sie erwarten würden, dass 0xFFFFFFFF ein gültiger Maximalwert ist.

Nach patent 6853957 beträgt die Reichweite 30.000 Jahre vor/nach der Epoche (1. Januar 1601). Das bedeutet, dass Sie es auch mit negativen Daten (d. H. Daten vor der Epoche) verwenden können.

EDIT: Nur berechnet: es kann (ca.) 58.5454 Tage im Wert von 100-Nanosekunden-Intervallen speichern, also +/- 30.000 Jahre klingt wie ein guter Wert zu gehen, wenn Sie negative Daten natürlich akzeptieren.

+0

Kein Problem.:) Ich würde dir auch vorschlagen, dass du vielleicht einen Realitätstest an diesem Tag machst, anstatt nur Grenzkontrollen zu machen - irgendetwas darüber hinaus, sagen wir, das Jahr 2100 ist falsch ... (außer du schreibst ein Spiel in der Ferne Zukunft natürlich!) –

+0

Stimmt - wir wissen noch nicht, an welchem ​​Wochentag der 3. April 31601 fallen wird. – MSalters

+1

Obwohl das Patent sagt FILETIME ist +/- 30.000 Jahre, ist es tatsächlich ein bisschen weniger. 0x7FFFFFFFFFFFFFFF/10.000.000/86.400/365.242198 ist 29.227 Jahre. Wählen Sie also Ihre Programmiergrenzen entsprechend aus. –

1

Es gibt eine Antwort in diesem MSDN-Artikel - Test Cases for the RTC Real-Time Functions Test: „Der Test für den Bereich mit den minimal möglichen FILE beginnend sieht (FILE 0 ist der Beginn 1. Januar 1601) und endet mit maximal möglichen FILE (Max FILE ist der maximale 64-Bit-Wert). "