11
votes

Est-ce que Java System Millisecondes prend en compte les bonds secondes?

Le système de fonction Java. actueltimemillis () renvoie apparemment le nombre de secondes depuis le 1er janvier 1970. Cependant, selon wikipedia.org/wiki/leap_seconde , depuis 1972, il y a eu 25 secondes. Cela signifie que le nombre de secondes réel depuis le 1er janvier 1970 a été 25 de plus qu'un calcul naïf suggérerait. Est-ce que le système. actueltimemillis () faire le calcul naïf et ignorez les secondes saut?


2 commentaires

Ce serait assez facile pour tester.


@RoberTharvey: True, mais cela ne vous dirait que quelque chose sur cette la version de la JVM sur que OS. Il est bon de demander si les normes garantissent quoi que ce soit.


5 Réponses :


8
votes

Officiellement, il appartient au système d'exploitation et à la mise en œuvre - au moins pour date . Des docs de java.util.date < / code> :

Bien que la classe de date est destinée à refléter le temps universel coordonné (UTC), il peut ne pas le faire exactement, en fonction de l'environnement hôte de la machine virtuelle Java. Presque tous les systèmes d'exploitation modernes supposent que 1 jour = 24 × 60 × 60 = 86400 secondes dans tous les cas. En UTC, toutefois, environ une fois par an ou deux, il y a une seconde supplémentaire, appelée "deuxième saut". Le saut seconde est toujours ajouté comme la dernière seconde de la journée et toujours le 31 décembre ou le 30 juin. Par exemple, la dernière minute de l'année 1995 était de 61 secondes de longue durée, grâce à une seconde étape ajoutée. La plupart des horloges informatiques ne sont pas suffisamment précises pour pouvoir refléter la distinction saut-seconde.

Je soupçonne que vous constaterez que bien que votre horloge de l'ordinateur soit approximativement alignée sur UTC, cela se fait via NTP ou similaire à corriger l'horloge périodiquement, plutôt que le système d'exploitation vraiment la mise en oeuvre.

Je crois que les bibliothèques JRE sont généralement les supposons le 86400 deuxième jour. Cela rend la vie si beaucoup plus simple, et si vous voulez corriger une horloge système inexacte de toute façon, vous pourriez aussi bien corriger pour sauter des secondes de cette façon.

Vous voulez vraiment résoudre ce que vous êtes intéressé. Si vous avez besoin d'un moyen de représenter des dates et des moments qui utilisent des secondes saut, les bibliothèques Java standard peuvent ne pas bien fonctionner pour vous. Même JSR-310 ne prend plus en charge les secondes sautant autant que je peut dire (qui est une décision très judicieuse pour la plupart des développeurs).


3 commentaires

J'ai fait des tests sur Android 4.2 et Windows 7, et le système.currenttimemillis () était en effet le nombre de millisecondes depuis 1-janvier-1970 sur l'hypothèse que chaque jour a exactement 86400 secondes. Donc, en effet, les secondes sautent sont ignorées, mais comme vous dites que les ordinateurs montrent le bon moment (incorporer des secondes sautés) car leurs horloges sont corrigées périodiquement :-).


@Stochastiquement: le test est trop faible. Il ne montrera pas comment le système prend en charge le saut secondes (POSIX, MILLS, STARP, NTP, TAI (Si l'entrée est 1970TAI dans ce dernier cas)).


Comme quelqu'un essaye d'implémenter " retard_longueur_in_nanoseconds = (find_time - maintenant) * Échelle " Vous ne pouvez pas sous-estimer à quel point je déteste les personnes qui pensent que les secondes peuvent être ignorées.



1
votes

En regardant le Javadoc pour Currenttimemillis (), il fait référence au Documentation de la classe de date , qui a cela à dire:

Bien que la classe de date est destinée à refléter le temps universel coordonné (UTC), il peut ne pas le faire exactement, en fonction de l'environnement hôte de la machine virtuelle Java. Presque tous les systèmes d'exploitation modernes supposent que 1 jour = 24 × 60 × 60 = 86400 secondes dans tous les cas. En UTC, toutefois, environ une fois par an ou deux, il y a une seconde supplémentaire, appelée "deuxième saut". Le saut seconde est toujours ajouté comme la dernière seconde de la journée et toujours le 31 décembre ou le 30 juin. Par exemple, la dernière minute de l'année 1995 était de 61 secondes de longue durée, grâce à une seconde étape ajoutée. La plupart des horloges informatiques ne sont pas suffisamment précises pour pouvoir refléter la distinction saut-seconde.

Donc, pour répondre à votre question: Oui, les secondes sautent sont comptabilisées.


3 commentaires

Mais je pense que cela signifie que la conclusion devrait être que "les secondes sautées ne sont pas comptabilisées", c'est-à-dire ignoré, car les systèmes d'exploitation supposent 86400 secondes par jour.


La façon dont je comprends: des comptes UTC pour les bondes secondes. Lier un fuseau horaire dans un système d'exploitation moderne explique simplement la différence de temps entre UTC et heure locale (et peut-être DST, selon l'utilisation). L'alternative serait que tout le monde a dérivé 35 secondes (Source: Wikipedia) à l'écart de l'UTC depuis le début du temps UNIX.


Je pense que vous avez raison, UTC compte pour le saut des secondes. Cependant, ma conclusion est que ces secondes sautent ne sont pas incluses dans le système.CurrentTimemémis (), comme je décris dans mon commentaire à la réponse que j'ai marquée comme "la réponse".



7
votes

POSIX nécessite que l'horloge système n'admette pas l'existence de secondes saut. MS Windows ne peut pas garantir la qualité (ni l'existence) du matériel de l'horloge du système, et il a une garantie de précision de 1 seconde. Java ne peut pas facilement faire quoi que ce soit le système sous-jacent refuse de faire. Les systèmes d'exploitation font partie de l'historique du Réglementations internationales qui entraînent une norme IEEE (PTP) qui nécessite des secondes sautées et une autre (POSIX) qui les nie.


0 commentaires

3
votes

Un moyen facile de vérifier si le saut secondes est comptabilisé ou non pour calculer le nombre de secondes écoulées depuis l'époque pour 00h00 à une journée donnée de l'année en cours.

Si ce nombre de secondes est congruent à 00 Modulo 60, les seconds sautent ne sont pas comptabilisés comme en 2013, vous devez avoir un module de 25 (pour tenir compte des 25 secondes de 25 secondes).


0 commentaires

2
votes

J'ai fait une petite expérience sur Javarepl : xxx

comme vous pouvez le voir voir , un simple arithmétique "naïf" qui considère juste une année bissextile, mais pas leaut de secondes, est utilisé. Aucune seconde supplémentaire n'est ajoutée ou soustraite.

mise à jour:

Identique pour le nouveau instantané Classe: < Pré> xxx


2 commentaires

FYI, la classe DATE est désormais héritée, supplantéée par les classes Java.Time intégrées à Java 8 et plus tard. Plus précisément, la classe instantanée remplace date .


@Basilbourque, merci! Est-ce en quelque sorte liée au problème des sondes saut en question?