Si j'exécute le programme suivant, qui analyse deux chaînes de dates faisant référence à des moments séparés d'une seconde et les compare :
public static void main(String[] args) throws ParseException {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str3 = "1927-12-31 23:54:07";
String str4 = "1927-12-31 23:54:08";
Date sDt3 = sf.parse(str3);
Date sDt4 = sf.parse(str4);
long ld3 = sDt3.getTime() /1000;
long ld4 = sDt4.getTime() /1000;
System.out.println(ld4-ld3);
}
Le résultat est le suivant :
353
Pourquoi la ld4-ld3
no 1
(comme je m'y attendais compte tenu de la différence d'une seconde entre les temps), mais 353
?
Si je change les dates en heures 1 seconde plus tard :
String str3 = "1927-12-31 23:54:08";
String str4 = "1927-12-31 23:54:09";
Dans ce cas ld4-ld3
sera 1
.
Version Java :
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Dynamic Code Evolution Client VM (build 0.2-b02-internal, 19.0-b04-internal, mixed mode)
Timezone(`TimeZone.getDefault()`):
sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
offset=28800000,dstSavings=0,
useDaylight=false,
transitions=19,
lastRule=null]
Locale(Locale.getDefault()): zh_CN
28 votes
Il peut s'agir d'un problème local.
112 votes
La vraie réponse est de toujours, toujours utiliser les secondes depuis l'époque pour l'enregistrement, comme l'époque Unix, avec une représentation entière de 64 bits (signée, si vous voulez autoriser les tampons avant l'époque). Tout système de temps réel a un comportement non linéaire et non monotone, comme les heures bissextiles ou l'heure d'été.
15 votes
Une excellente vidéo sur ce genre de choses : youtube.com/watch?v=-5wpm-gesOY
4 votes
Et une autre du même homme, @ThorbjørnRavnAndersen : youtube.com/watch?v=Uqjg8Kk1HXo (secondes intercalaires). (Celle-ci provient de la chaîne YouTube de Tom Scott, et non de Computerphile).
2 votes
@Phil H Les "secondes depuis l'époque" (c'est-à-dire le temps Unix) ne sont pas linéaires non plus, dans le sens où les secondes POSIX ne sont pas des secondes SI et varient en longueur.
0 votes
Le temps Unix n'est pas non plus monotone si vous incluez des sous-secondes (ce qui est courant pour les applications de journalisation). Il sautera en arrière lors d'une seconde intercalaire.
0 votes
Les secondes POSIX peuvent varier en longueur, mais l'échelonnement est une option de mise en œuvre autorisée et assez fréquente. En d'autres termes, la différence entre des horodatages séparés d'une seconde peut être nulle lorsqu'une seconde intercalaire est ajoutée, ou négative si les horodatages sont séparés de moins d'une seconde. Le temps Unix a donc un comportement non monotone, comme d'autres systèmes de temps réels, et n'est pas une panacée.