Frage

Die FILETIME Struktur von Januar zählt 1 1601 (vermutlich der Beginn des Tages) gemäß der Microsoft-Dokumentation, aber nicht diese Schaltsekunden enthalten?

War es hilfreich?

Lösung

Die Frage sollte nicht sein, wenn FILETIME Schaltsekunden enthält.

Es sollte sein:

  

Haben die Menschen, Funktionen und Bibliotheken, die eine FILETIME interpretieren (das heißt FileTimeToSystemTime) umfassen Schaltsekunden, wenn die Dauer zu zählen?

Die einfache Antwort ist "Nein" . FileTimeToSystemTime kehrt Sekunden als 0..59.


Die einfachere Antwort lautet: " natürlich nicht, wie könnte es ?".

Mein Windows 2000-Rechner nicht weiß, dass es in den zehn Jahren hinzugefügt 2 Schaltsekunden waren, da sie veröffentlicht wurde. Jede Auslegung macht es einen FILETIME ist falsch.


Schließlich, anstatt sich auf Logik verlassen, wir durch direkte experimentelle Beobachtung bestimmen kann, in Frage stellen die Antwort auf den Plakaten:

var
    systemTime: TSystemTime;
    fileTime: TFileTime;
begin
    //Construct a system-time for the 12/31/2008 11:59:59 pm
    ZeroMemory(@systemTime, SizeOf(systemTime));
    systemtime.wYear := 2008;
    systemTime.wMonth := 12;
    systemTime.wDay := 31;
    systemTime.wHour := 23;
    systemtime.wMinute := 59;
    systemtime.wSecond := 59;

    //Convert it to a file time
    SystemTimeToFileTime(systemTime, {var}fileTime);

    //There was a leap second 12/31/2008 11:59:60 pm
    //Add one second to our filetime to reach the leap second
    filetime.dwLowDateTime := fileTime.dwLowDateTime+10000000; //10,000,000 * 100ns = 1s

    //Convert the filetime, sitting on a leap second, to a displayable system time
    FileTimeToSystemTime(fileTime, {var}systemTime);

    //And now print the system time
    ShowMessage(DateTimeToStr(SystemTimeToDateTime(systemTime)));

Das Hinzufügen einer Sekunde

12/31/2008 11:59:59pm

gibt

1/1/2009 12:00:00am

statt

1/1/2009 11:59:60pm

Q.E.D.

Original Poster könnte es nicht gefallen, sondern Gott in Ordnung gebracht es absichtlich so, dass ein Jahr nicht teilbar durch einen Tag. Er hat es nur vermasseln Programmierer.

Andere Tipps

Hier 's einige weitere Informationen darüber, warum diese bestimmte Datum gewählt wurde.

  

Die FILETIME-Struktur aufzeichnet Zeit in   die Form von 100-Nanosekunden-Intervalle   seit dem 1. Januar war 1601. Warum die   Datum gewählt?

     

Der Gregorianische Kalender arbeitet auf einem   400-Jahres-Zyklus, und 1601 ist die erste   Jahr des Zyklus, der aktiv war   die Zeit, Windows NT wurde   entworfen. Mit anderen Worten, es war   gewählt die Mathematik kommen zu machen   schön.

     

Ich habe tatsächlich die E-Mail von Dave   Cutler bestätigt dies.

Es kann auf diese Frage keine einzige Antwort sein, ohne vorher zu entscheiden: Was ist die Windows-FILE zählen eigentlich? Die Microsoft docs sagen, es zählt 100 ns Intervalle seit 1601 UTC, aber dies ist problematisch.

Keine Form der international koordinierten Zeit des Jahres vor existierte 1960. Der Name UTC sich in der Literatur tritt nicht vor dem Jahr 1964. Der Name UTC als offizielle Bezeichnung noch nicht existierte bis 1970. Aber es kommt noch schlimmer. The Royal Greenwich Observatory wurde erst 1676 gegründet und versucht, so auch die FILE zu interpretieren als GMT keine klare Bedeutung hat, und es war nur um dann, dass die Pendeluhr mit genauen Hemmungen begannen Genauigkeiten von 1 Sekunde zu geben.

Wenn FILE als mittlere Sonnen Sekunden interpretiert wird dann die Anzahl der Schaltsekunden seit 1601 gleich Null ist, für UT keine Schaltsekunden hat. Wenn FILE interpretiert wird, als ob es Atomchronometer waren dann seit 1601 die Anzahl der Schaltsekunden beträgt etwa -60 (das ist negativ 60 Schaltsekunden).

Das ist alte Geschichte, was ist mit der Zeit, da Atomchronometer? Es ist nicht besser, weil die nationalen Regierungen haben nicht die Unterscheidung zwischen mittleren Sonnen Sekunden und SI Sekunden gemacht. Seit einem Jahrzehnt diskutiert die ITU-R wurde Schaltsekunden zu verlassen, aber sie haben nicht den internationalen Konsens erreicht. Ein Teil des Grundes dafür kann in dem zu sehen ist Javascript auf dieser Seite (siehe auch den Delta-T-Link auf dieser Seite für Plots der alten Geschichte). Da die nationalen Regierungen haben eine klare Unterscheidung nicht gemacht, jeder Versuch, die Anzahl der Sekunden seit 1972 läuft Gefahr ungültig nach den Gesetzen einiger Zuständigkeit zu definieren. Die Delegierten der ITU-R sind sich bewusst, diese Komplexität, da die Leute auf dem POSIX-Ausschuß. Bis die diplomatischen Fragen ausgearbeitet werden, bis die nationalen Regierungen und internationale Standards eine klare Unterscheidung und Wahl zwischen mittleren Sonnen und SI Sekunden machen, gibt es wenig Hoffnung, dass die Computer-Standards folgen können.

Schaltsekunden werden unvorhersehbar durch den IERS hinzugefügt. 23 Sekunden wurden seit 1972 hinzugefügt, wenn UTC und Schaltsekunden definiert. Wikipedia sagt: „weil die Erdrotation Rate auf lange Sicht nicht vorhersehbar ist, ist es nicht möglich ist, die Notwendigkeit, dass sie mehr als sechs Monate im Voraus vorherzusagen.“

Da Sie eine Geschichte halten müßten, wenn Schaltsekunden eingefügt wurden, und halten Sie die O Aktualisierung eine Referenz zu halten, wenn sie eingeführt worden sind, und der Unterschied ist so klein, es ist fair keine allgemein- zu erwarten Zweck OS für Schaltsekunden zu kompensieren.

Darüber hinaus regelmäßige Taktdrift, der einfachen elektronischen Uhr in Ihrem PC zu UTC verglichen, so ist viel größer als die Entschädigung für Schaltsekunden erforderlich. Wenn Sie die Art von Präzision benötigen für Schaltsekunden zu kompensieren, sollten Sie nicht die hoch ungenaue PC-Uhr verwenden.

Die Antwort auf diese Frage verwendet, nicht zu sein, aber hat sich geändert: JA, Art, manchmal ...

Pro der Windows Networking Team Blog-Artikel :

  

in Server starten 2019 und Windows 10. Oktober [2018] Aktualisierungszeit APIs nehmen jetzt berücksichtigt alle Schaltsekunden das Betriebssystem ist sich dessen bewusst, wenn es übersetzt FILE zu Systemtime.

Da es keine Schaltsekunden ausgegeben wurden, seit der Zeit dieser Funktion hinzugefügt wird, ist das Betriebssystem von irgendwelchen Schaltsekunden noch nicht bewusst. Wenn jedoch in der nächsten Sekunde offiziellen Sprung seinen Weg in die Welt macht, Windows-Computer, die diese neue Funktion aktiviert ist davon Spur halten und damit FILETIME Werte werden durch die Anzahl der Schaltsekunden auf dem Computer zu dem Zeitpunkt sind sie ausgeglichen werden interpretiert.

Der Blog-Beitrag geht weiter zu beschreiben:

  

ist keine Änderung zu FILE gemacht. Sie stellt nach wie vor die Zahl von 100 ns Intervallen seit Beginn der Epoche. Was sich geändert hat ist die Interpretation dieser Zahl, wenn es um SYSTEM und zurück umgewandelt wird. Hier ist eine Liste der betroffenen APIs:

     
      
  • GetSystemTime
  •   
  • GetLocalTime
  •   
  • FileTimeToSystemTime
  •   
  • FileTimeToLocalTime
  •   
  • SystemTimeToFileTime
  •   
  • SetSystemTime
  •   
  • SetLocalTime
  •   
     

Vor dieser Version hatte SYSTEM gültige Werte für wSecond zwischen 0 und 59 SYSTEM jetzt aktualisiert wurde ein Wert von 60 zu ermöglichen, sofern das Jahr, den Monat und den Tag repräsentiert Tag, in dem eine Schaltsekunde gültig ist.

     

...

     

Um einen Prozess der 60 Sekunden in der Struktur SYSTEM erhalten müssen explizit Opt-in.

Beachten Sie, dass die Opt-in innerhalb der Funktionen auf das Verhalten gilt aufgeführt, wie eine FILETIME zu einem SYSTEMTIME abgebildet wird. Unabhängig davon, ob Sie Opt-in oder nicht, wird das Betriebssystem noch Offset FILETIME Werte entsprechend den Schaltsekunden es ist sich dessen bewusst.

Im Hinblick auf die Vereinbarkeit der Artikel heißt es:

  

Anwendungen, die auf 3rd-Party-Frameworks verlassen sollten ihre Rahmen der Implementierung unter Windows gewährleistet ist, auch in die richtigen APIs den Aufruf der richtigen Zeit zu berechnen, sonst wird die Anwendung die falsche Zeit berichtet.

und bietet auch eine Anbindung an eine frühere Post die beschreibt, wie die gesamte Funktion deaktivieren, wie folgt:

  

... Sie können dem Stand der Betriebssystemverhalten und deaktivieren Schaltsekunden auf der ganzen Linie zurückkehren, indem Sie den folgenden Registrierungsschlüssel hinzu:

     
      
  • HKLM:\SYSTEM\CurrentControlSet\Control\LeapSecondInformation
  •   
  • Typ: "REG_DWORD"
  •   
  • Name: Aktiviert
  •   
  • Wert: 0 Deaktiviert die systemweite Einstellung
  •   
  • Wert: 1 Aktiviert die systemweite Einstellung
  •   
     

Als nächstes wird das System neu starten.

Eine sehr grobe Zusammenfassung:

UTC = (Atomzeit) + (Schaltsekunden) ~~ (mittlere Sonnenzeit)

Die MS-Dokumentation sagt, und zwar „UTC“, und so sollte die Schaltsekunden umfasst. Wie immer mit MS, die Leistung kann variieren.

scroll top