2010-11-08 14 views
0

Voici le code, pour votre plus grand plaisir:Résultats inattendus lorsque vous soustrayez les dates

public static void main(String[] args) throws Exception { 
    Calendar cal = Calendar.getInstance(); 
    cal.set(2010, Calendar.JULY, 10, 1, 0, 20); 
    Date d1 = cal.getTime(); 
    Date d2 = new Date(); 
    int seconds = 22; 
    d2.setTime(d1.getTime() - seconds*1000); 
    SimpleDateFormat iso_format = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss"); 
    System.out.println(iso_format.format(d1) + " - " + seconds + "s = " + iso_format.format(d2)); 
} 

Sortie: 2010-07- 10 01:00:20 - 22s = 2010-07- 24 : 59: 58

La réponse ne devrait-elle pas être 2010-07- 24:59:58? Pourquoi revient-il au même jour? Y a-t-il un moyen de le réparer?

+1

meilleure question: pourquoi il ne 2010-07-10 00:59:58 (22 secondes avant 01:00:20) – DennyRolling

+0

@High: lorsque vous utilisez le spécificateur de format 'K', l'heure champ ∈ '[1,24]' pas '[0, 23]'. –

+0

Pourquoi dans le monde quelqu'un voudrait-il un spécificateur de format d'heure qui soit ∈ [1,24]? –

Répondre

3

l'heure 24 (puisque vous avez utilisé 'kk' pour formater) est considérée le jour suivant, c'est-à-dire le 10ème. c'est équivalent à minuit. J'utilise 'HH' pour formater les heures, ce qui afficherait la 24ème heure comme '00'. Cela a plus de sens pour moi et je crois que plus de normes sont conformes.

la date change à la 00/24e heure. Si vous deviez soustraire une autre heure de la date résultante, la date deviendrait le 9ème comme prévu.

également, si vous voulez le vrai format d'heure ISO 'HH' est meilleur que 'kk'.

http://en.wikipedia.org/wiki/ISO_8601#Times