2017-06-17 2 views
0

J'essaie de calculer le nombre de jours entre deux dates. Voici mon code:Jours entre deux dates. Où est l'erreur dans les dates?

public class Main { 
    public static void main(String[] args) { 
     SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy"); 
     Date date1 = null; 
     Date date2 = null; 
     String str1 = "01.01.1900"; 
     String str2 = "16.06.2017"; 
     try{ 
      date1 = format.parse(str1); 
      date2 = format.parse(str2); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
     long i1 = date2.getTime() - date1.getTime(); 
     System.out.println(i1/86400000);//milisec to days 
    } 
} 

Le résultat est: 42899 jours.

mais si nous Revérifier qu'il soustraction dans EXCEL, le résultat est 42901 enter image description here

S'il vous plaît, quelqu'un peut me expliquer où est le résultat de la vérité?

+1

Je ne peux plus fortement déconseiller l'utilisation du l'héritage de la classe 'java.util.Date'. Vous devriez plutôt regarder dans le paquet 'java.time' et trouver la classe la plus appropriée pour votre cas d'utilisation (probablement' LocalDate' dans ce cas). –

+0

Vous devriez tester votre code en utilisant des dates plus proches, par exemple '01.01.1900' et' 02.01.1900'. Peut-être alors vous trouvez où est le problème (ou peut-être que Excel compte quelque chose de différent de vous). –

+0

la même différence de 2 jours –

Répondre

2

Java autour du résultat vers le bas lors de la division des nombres entiers, donc je pense que vous avez perdu un jour ici:

System.out.println(i1/86400000);//milisec to days 

Après avoir essayé Java 8 API il me montre 42900 jours (notez que ni Java 8 ni Excel ne comprennent pas le dernier jour de la plage):

LocalDate from = LocalDate.of(1900, Month.JANUARY, 1); 
LocalDate to = LocalDate.of(2017, Month.JUNE, 16); 
long daysBetween = ChronoUnit.DAYS.between(from, to); 

un autre jour a été calculé par Excel dans une mauvaise façon en raison d'un bug comme décrit here Donc, répondre à votre question - vous perdez un jour sur l'arrondissement et un autre jour a été incorrectement ajouté par Excel.

+0

Merci beaucoup! –

+0

Incorrect. Excel n'inclut pas non plus la date de fin. Le problème est dans Excel, qui pense incorrectement que 1900 est une année bissextile. Ce n'est pas. Voir: [Existe-t-il un bogue dans Excel concernant les dates?] (Https://stackoverflow.com/q/13722566/5221149) --- Vous avez cependant raison sur le problème d'arrondi, mais vous n'expliquez pas * pourquoi * là est un problème d'arrondi, c'est-à-dire qu'il est causé par la perte d'une heure lors du passage à l'heure d'été. – Andreas

+0

@Andreas Merci d'avoir signalé cela - j'ai mis à jour ma réponse. –

0

Utilisez Joda Time. Il a une meilleure API que ce qui est disponible dans la bibliothèque standart de Java. Voici mon code pour votre cas:

package com.example; 

import org.joda.time.DateTime; 
import org.joda.time.Days; 

public class Main{ 
public static void main(String[] args) { 

    DateTime start = new DateTime(1900, 1, 1, 0, 0, 0, 0); 
    DateTime end = new DateTime(2017, 6, 16, 0, 0, 0, 0); 

    // calculate days between two dates 
    int days = Days.daysBetween(start, end).getDays(); 

    System.out.println("Days = " + days); 
} 
} 

Et le résultat est Days = 42900

+0

Pourquoi appelez-vous 'minusDays (1)'? Est-ce juste pour obtenir artificiellement le même résultat * incorrect * qu'Excel? – Andreas

+0

Oh, je suis désolé pour ça. Je sens que j'ai été un peu négligent. Merci pour vos commentaires! Je vais corriger le code) –

+0

Joda-Time est en maintenance, la recommandation officielle de Joda-Time est que vous migrez vers 'java.time'. Encore un meilleur choix que le 'java.util.Date 'longtemps obsolète, cependant. –