Windows Timestamp nach Unix konvertieren

Vor einiger Zeit, musste ich von einem Linux Server, über LDAP, auf ein Windows Server Active Directory zugreifen. Ziel war es, einige Daten von Usern abzufragen und weiter zu verarbeiten. Darunter gab es auch Datumsangaben welche benötigt wurden. Beim ersten Blick darauf sah es wie ein gewöhnlicher Timestamp aus.

Als Linux Anwender habe ich mir zunächst nichts weiter dabei gedacht und das Datum wie gewohnt formatiert. Und genau hier begann das Problem!

Das Ergebnis war vollkommen falsch und ergab zuerst überhaupt keinen Sinn. Beim zweiten Blick bemerkte ich auch den ungewöhnlich langen String des Zeitstempels. Wo lag nun der Denkfehler? Ganz naiv, bin ich von einem Unix-Timestamp ausgegangen. Dieser existiert in der Windows Welt natürlich nicht. Nach kurzer Recherche im Internet fand ich heraus, dass Windows mit der Zeitrechnung am 01.01.1601 beginnt.

Überblick über die Zeitstempel

Unix-Timestamp
Berechnung ab: 01.01.1970 – 00:00:00 UTC
Angegeben wird die Zeit in Sekunden seit Beginn der Rechnung.

Windows-Timestamp
Berechnung ab: 01.01.1601 – 00:00:00 UTC
Angegeben wird die Zeit in 100-Nanosekunden-Intervallen seit Beginn der Rechnung.

Berechnung

Bei der Umrechnung gilt es nun zwei Punkte zu beachten. Ersten muss der Windows Zeitstempel in Sekunden umgerechnet werden und zweitens, muss die Differenz zwischen 1601 und 1970 (11644473600 Sek.) abgezogen werden. Schaltsekunden werden zum Glück nicht berücksichtigt.

Umrechnung in Sekunden:
Win-Timestamp / 10000000

Differenz zwischen 1601 und 1970 subtrahieren:
Win-Timestamp-in-Sekundden - 11644473600

Ganze Formel:
( Win-Timestamp / 10000000 ) - 11644473600 = Unix-Timestamp

Nachkommastellen bei der Division können vernachlässigt werden.

Beispiel für ein Datum

14.06.2014 14:47:25 Mitteleuropäische Sommerzeit

Win-Timestamp: 130472236456387269

Unix-Timestamp: 1402750045

2 Kommentare » Schreibe einen Kommentar

  1. Ganz richtig scheint das Ergebnis aber nicht: 130472236456387269 (Windows) als Unix-Timestamp ist 1402750046 bzw. als Zeit 2014-06-14 14:47:26.

    • Der unterschied von einer Sekunde kommt von den Nachkommastellen bei der Division. Wenn diese beim weiter rechnen berücksichtigt und in dem Fall aufgerundet werden, entsteht dieses Problem.

      Windows selbst, berechnet den Zeitstempel auf meine genannte Uhrzeit um:
      w32tm.exe /ntte 130472236456387269
      151009 12:47:25.6387269 - 14.06.2014 14:47:25

      Hier ist also auszugehen, dass die Nachkommastellen bei der Division zu vernachlässigen sind.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.