Tun Java system Millisekunden Berücksichtigung von Schaltsekunden?
Die java-Funktion System.currentTimeMillis() anscheinend gibt die Anzahl der Sekunden seit dem 1. Januar 1970. Doch nach wikipedia.org/wiki/Leap_second, seit 1972 es sind schon 25 Schaltsekunden. Dies bedeutet, dass die tatsächliche Anzahl der Sekunden seit dem 1. Januar 1970 wurde 25 mehr als eine naive Berechnung zu vermuten wäre. System.currentTimeMillis() tun, die naive Berechnung und ignorieren der Schaltsekunden?
- Das wäre einfach genug, um zu testen.
- Stimmt, aber es würde Ihnen nur sagen, etwas über die version der JVM an das Betriebssystem. Es ist gut zu Fragen, ob die Normen Garantie für nichts.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Offiziell, es ist bis auf das OS und die Umsetzung - zumindest für
Date
. Aus den docs vonjava.util.Date
:Ich vermute, Sie werden feststellen, dass, obwohl Ihr computer die Uhr ist in etwa ausgerichtet auf UTC, das ist getan über NTP oder dergleichen korrigiert wird, die Uhr in regelmäßigen Abständen, eher als die OS wirklich Umsetzung Schaltsekunden.
Glaube ich, dass die JRE-Bibliotheken in der Regel tun übernehmen den 86400 Sekunden am Tag. Es macht das Leben so viel einfacher, und wenn Sie gehen, um korrekt für eine ungenaue Systemzeit sowieso, könnte man genauso gut richtig für Schaltsekunden auch.
Sie wirklich wollen, um herauszufinden, was Sie interessiert. Wenn Sie eine Möglichkeit zur Darstellung von Daten und Zeiten, die leap verwenden Sekunden, wird der standard-Java-Bibliotheken möglicherweise nicht gut für Sie arbeiten. Auch JSR-310 nicht mehr unterstützt Schaltsekunden so weit ich erzählen kann (das ist eine sehr vernünftige Entscheidung, die für die meisten Entwickler).
delay_length_in_nanoseconds = (end_time - now) * scale
" man kann nicht unterschätzen, wie viel ich hasse Leute, die denken Sie Schaltsekunden ignoriert werden kann.POSIX erfordert, dass die Systemuhr nicht zugeben, die Existenz von Schaltsekunden. MS Windows kann keine Garantie für die Qualität (oder Existenz) von der Systemuhr hardware, und es hat mied Garantie von 1 Sekunde Genauigkeit. Java kann nicht einfach alles tun, dass das zugrunde liegende system weigert sich, das zu tun. Die Betriebssysteme sind gelähmt durch die Geschichte der internationale Vorschriften, dass Ergebnis in einem IEEE-standard (PTP), erfordert Schaltsekunden und andere (POSIX), die abstreitet.
Einfache Möglichkeit, um zu überprüfen, ob Schaltsekunden berücksichtigt werden oder nicht, ist die Berechnung der Anzahl der verstrichenen Sekunden seit Beginn der Epoche, die für 00:00 an jedem beliebigen Tag im Laufenden Jahr.
Wenn die Anzahl der Sekunden ist kongruent zu 00 modulo 60, dann werden die Schaltsekunden nicht berücksichtigt, da im Jahr 2013 sollte Sie ein E-Modul von 25 (Rechnung für die letzten 25 Schaltsekunden).
Habe ich ein kleines experiment auf javarepl:
Wie Sie sehen können, eine einfache, "naive" - Arithmetik, die nur hinsichtlich Schaltjahr, aber nicht Schaltsekunden, verwendet wird. Keine zusätzliche Sekunden werden addiert oder subtrahiert werden.
Update:
Gleiche für die neue
Instant
Klasse:Date
Klasse ist nun Erbe, verdrängt durch die java.Zeit-Klassen gebaut in Java 8 und höher. Insbesondere dieInstant
Klasse ersetztDate
.Blick auf die Javadoc für currentTimeMillis(), es referes der Dokumentation der Date-Klasse, was hat dies zu sagen:
Also um deine Frage zu beantworten: ja, Schaltsekunden berücksichtigt werden.