2012-07-17 6 views
4

On m'a donné une tâche pour calculer le nombre de jours entre 2 dates données et j'ai trouvé un résultat vraiment étrange (2127 jours) pour la ligne d'entrée 3 qui semble être correcte mais la sortie donnée attendue pour cette tâche est un résultat différent (1979 jours). J'ai regardé cet article Calculate the number of days between two dates ainsi que plusieurs autres messages ici et utilisé la bibliothèque Joda comme conseillé et obtenir un résultat de 2127 jours.Jours entre 2 dates données

* Problème: Étant donné deux dates (au cours des années 1901 et 2999, inclusivement), trouvez le nombre de jours entre les deux dates.

Entrée: Six ensembles de données. Chaque ensemble a deux dates au format mois, jour, année. Par exemple, la ligne d'entrée '6, 2, 1983, 6, 22, 1983' représente 2 Juin 1983 au 22 Juin, 1983.

Sortie: Le nombre de jours entre les dates indiquées, à l'exception du départ date et la date de fin. Par exemple, il y a 19 jours entre le 2 juin 1983 et le 22 juin 1983; à savoir, le 3 Juin, 4, ..., 21.

entrée de l'échantillon (3 sets):

Input Line #1: 6, 2, 1983, 6, 22, 1983 
Output #1: 19 

Input Line #2: 7, 4, 1984, 12, 25, 1984 
Output #2: 173 

Input Line #3: 1, 3, 1989, 3, 8, 1983 
Output #3: 1979 

Voici ma solution

private boolean isYearValid(int year){ 
    return year >=1901 && year <= 2999; 
} 

public int numOfDays(String dates){ 
    Calendar date1 = new GregorianCalendar(); 
    Calendar date2 = new GregorianCalendar(); 
    String [] dateSplit = dates.split(","); 
    int len = dateSplit.length; 
    int year = 0; 
    for(int i=0;i<len;i++){ 
     dateSplit[i]=dateSplit[i].trim(); 
     if(i==2||i==5){ 
      try { 
       year = Integer.parseInt(dateSplit[i]); 
      } 
      catch (NumberFormatException e){ 
       throw new IllegalArgumentException(String.format("Usage: Year input %s is not valid",dateSplit[i])); 
      } 
      if(!isYearValid(year)) 
       throw new IllegalArgumentException("Usage: Year of date should be between the years 1901 and 2999, inclusive"); 
     } 
    } 
    int [] d = new int[6]; 

    for(int i=0;i<6;i++) 
     try { 
      d[i]=Integer.parseInt(dateSplit[i]); 
     } 
    catch(NumberFormatException e){ 
     throw new IllegalArgumentException("Usage: Date entered is not valid"); 
    } 
    date1.set(d[2], d[0],d[1]); 
    date2.set(d[5], d[3], d[4]); 
    long milli1= date1.getTimeInMillis(); 
    long milli2 = date2.getTimeInMillis(); 
    long diff; 
    if(milli1>milli2){ 
     diff = milli1 - milli2; 
    } 
    else{ 
     diff = milli2 - milli1; 
    } 
    return (int) (diff/(24 * 60 * 60 * 1000))-1; 
} 

Résolu - On dirait que les données de test a été mal depuis 1, 3, 1989, 8, 3, 1983 produit 1979 jours.

+3

Est-ce que ce travail est fait? – bvulaj

+0

C'est un exercice qui m'a été donné mais je pense que j'ai peut-être résolu le problème étant donné que 1, 3, 1989, 8, 3, 1983 produit 1979 jours. On dirait que les données de test qui m'ont été données étaient incorrectes. – unleashed

+0

Autre chose dont je ne suis pas sûr que vous teniez compte, le [Calendar.set (int, int, int)] (http://docs.oracle.com/javase/1.4.2/docs/api/java /util/Calendar.html#set%28int,%20int,%20int%29) prend un mois qui commence à '0'. Donc Juin est '5'. –

Répondre

2

Par curiosité, est ce devoir? Si non, pourquoi ne pas simplement utiliser la bibliothèque Joda-Time qui fait cela pour vous. Il prend en charge la longueur du mois, les années bissextiles, etc ....

DateTime dt1 = ...; 
    DateTime dt2 = ...; 
    Duration duration = new Duration(dt1, dt2); 
    long days = duration.getStandardDays();