Vor ein paar Jahren bin ich auf diese Datei auf unserem Fileserver gestoßen.
Und ich frage mich, wie eine Datei sagen kann, dass sie 1641 erstellt wurde. Soweit ich weiß, wird die Zeit auf dem PC durch die Anzahl der Sekunden seit dem 1. Januar 1970 definiert. Wenn dieser Index ausfällt, können Sie den 31. Dezember 1969 erhalten (der Index sagt wahrscheinlich -1), aber ich bin diesbezüglich ratlos scheinbar zufälliges Datum, das sogar vor der Gründung der Vereinigten Staaten von Amerika liegt.
Wie könnte eine Akte also 1641 datiert werden?
PS: Die Daten sind auf Französisch. Février ist Februar.
filesystems
Fredy31
quelle
quelle
clock_gettime(2)
Manpage finden Sie eine Definition dessenstruct timespec
, wasstat
und andere Systemaufrufe verwenden, um Zeitstempel zwischen User-Space und Kernel zu übergeben. Es ist eine Struktur mit einemtime_t
in Sekunden und einerlong tv_nsec
Nanosekunde. Auf 64-Bit-Systemen sind beide 64-Bit-Systeme, sodass der gesamte Zeitstempel 128 Bit (16 Byte) beträgt. (Entschuldigung für zu viele Details, ich wurde mitgerissen.)Antworten:
Warum ist ein Datum aus dem 17. Jahrhundert möglich?
Windows speichert keine Zeitstempel für Dateiänderungen wie Unix-Systeme . Laut Windows Dev Center (Schwerpunkt Mine):
Wenn Sie hier einen falschen Wert einstellen, können Sie problemlos Daten aus dem 17. Jahrhundert abrufen.
Eine andere wichtige Frage ist natürlich: Wie wurde dieser Wert festgelegt? Was ist das aktuelle Datum? Ich denke, Sie werden es nie herausfinden können, da dies einfach ein Rechenfehler im Dateisystemtreiber gewesen sein könnte. Eine andere Antwort geht davon aus, dass es sich bei dem Datum tatsächlich um einen Unix-Zeitstempel handelt, der als Windows-Zeitstempel interpretiert wird. Die Berechnung erfolgt jedoch in unterschiedlichen Intervallen (Sekunden vs. Nanosekunden).
In welcher Beziehung steht dies zum Problem des Jahres 2038?
Die Verwendung eines 64-Bit-Datentyps bedeutet, dass Windows (im Allgemeinen) nicht vom Problem des Jahres 2038 betroffen ist , das herkömmliche Unix-Systeme haben, da Unix anfänglich eine 32-Bit-Ganzzahl verwendete, die früher als die 64-Bit-Ganzzahl von Windows überläuft hat. (Dies ist trotz Unix-Betrieb in Sekunden und Windows-Betrieb in Mikro- / Nanosekunden.)
Windows ist natürlich weiterhin betroffen, wenn 32-Bit-Programme verwendet werden, die mit alten Versionen von Visual Studio kompiliert wurden.
Neuere Unix-Betriebssysteme haben den Datentyp bereits auf 64 Bit erweitert, wodurch das Problem vermieden wird. (Da Unix-Zeitstempel in Sekunden ausgeführt werden, liegt das neue Umlaufdatum in 292 Milliarden Jahren.)
Was ist das maximale Datum, das eingestellt werden kann?
Für die Neugierigen - so berechnen Sie das:
@corsiKa
erklärt, wie wir Schaltjahre abziehen können: 29247/365/4 ≈ 20Einige Leute haben tatsächlich versucht, dies einzustellen und kamen mit dem gleichen Jahr.
quelle
time_t
es sich um einen 64-Bit-Typ handelt. Daher verwenden Anwendungen hoffentlichtime_t
anstelle eines Integer-Typs einen 32-Bit- und einen 32-Bit-Typ würde Zeitstempel abschneiden ... Wie auch immer, falls jemand neugierig auf den Status des Problems war, ist es meistens gelöst, mit Ausnahme von älteren 32-Bit-Versionen. IDK, wenn 32-Bit-ARM im Jahr 2038 noch relevant sein wird, aber dies wird mindestens eine ABI-Änderung erzwingen. 32-Bit x86 ist in der Unix-Welt so gut wie verschwunden. Es ist nur Windows, wo 32-Bit-Code noch verbreitet ist.Wenn Sie sich nicht schlecht fühlen, wenn Sie raten, lassen Sie mich dies erklären. Und ich meine nicht "jemand hat den Wert auf Unsinn gesetzt", das ist natürlich immer möglich :)
Die Unix-Zeit verwendet normalerweise die Anzahl der Sekunden seit 1970. Windows verwendet dagegen 1601 als Startjahr. Wenn wir also annehmen (und das ist eine große Annahme!), Dass das Problem eine falsche Umrechnung zwischen den beiden Zeiten ist, können wir uns vorstellen, dass das Datum, das eigentlich dargestellt werden sollte,
irgendwann im Jahr 2011 (1970 + 41) liegt, was falsch umgerechnet wurde bis 1640 (1601 + 41). EDIT: Eigentlich habe ich im Windows-Startjahr einen Fehler gemacht. Es ist möglich, dass die tatsächliche Erstellungszeit im Jahr 2010 lag oder dass ein anderer Fehler aufgetreten ist (Off-by-One-Fehler sind in der Software ziemlich häufig: D).Angesichts der Tatsache, dass dieses Jahr zufällig ein weiteres Tracking-Datum für die betreffende Datei ist, halte ich dies für eine ziemlich plausible Erklärung :)
quelle
Wie von anderen geschrieben, ist die Windows-Epoche am 1601-01-01 00:00 .
Die Anzahl der Sekunden zwischen dieser Epoche und der angezeigten Dateizeit beträgt 1.266.705.294 .
Wenn wir das zur Unix-Epoche hinzufügen, erreichen wir am Samstag den 20.02.2010 um 23:34:54 Uhr MESZ . Dies ist ungefähr ein Jahr vor dem letzten Zugriffsdatum, was es einigermaßen plausibel macht. Es könnte sich also um einen Unix-Zeitstempel handeln, der gegen die falsche Epoche interpretiert wurde.
quelle
Wie für diese Art von Fragen üblich, hat Raymond Chens Blog eine Antwort auf diese Frage aus dem Artikel "Warum ist die Win32-Epoche am 1. Januar 1601?". Eintrag vom 6. März 2009:
quelle