40 votes

Comment soustraire des dates en Java ?

Mon cœur saigne intérieurement après avoir dû aller si loin pour soustraire deux dates afin de calculer l'écart en nombre de jours :

    GregorianCalendar c1 = new GregorianCalendar();
    GregorianCalendar c2 = new GregorianCalendar();
    c1.set(2000, 1, 1);
    c2.set(2010,1, 1);
    long span = c2.getTimeInMillis() - c1.getTimeInMillis();
    GregorianCalendar c3 = new GregorianCalendar();
    c3.setTimeInMillis(span);
    long numberOfMSInADay = 1000*60*60*24;
    System.out.println(c3.getTimeInMillis() / numberOfMSInADay); //3653

alors qu'il ne s'agit que de deux lignes de code en .NET, ou dans tout autre langage moderne.

Est-ce atroce de la part de Java ? Ou y a-t-il une méthode cachée que je devrais connaître ?

Au lieu d'utiliser GregorianCalendar, est-il possible d'utiliser la classe Date dans util ? Si oui, dois-je faire attention à des choses subtiles comme l'année 1970 ?

Gracias

49voto

BalusC Points 498232

C'est en effet l'un des plus gros échecs épiques de l'API Java standard. Un peu de patience, et vous obtiendrez votre solution à la saveur de la nouvelle API Date et Heure spécifiée par JSR 310 / ThreeTen qui sera (très probablement) inclus dans la prochaine version de Java 8.

Jusque-là, vous pouvez vous en sortir avec JodaTime .

DateTime dt1 = new DateTime(2000, 1, 1, 0, 0, 0, 0);
DateTime dt2 = new DateTime(2010, 1, 1, 0, 0, 0, 0);
int days = Days.daysBetween(dt1, dt2).getDays();

Son créateur, Stephen Colebourne, est d'ailleurs à l'origine de la JSR 310, ce qui explique qu'elle soit très similaire.

18voto

daniel.deng Points 131

Vous pouvez utiliser l'approche suivante :

SimpleDateFormat formater=new SimpleDateFormat("yyyy-MM-dd");

long d1=formater.parse("2001-1-1").getTime();
long d2=formater.parse("2001-1-2").getTime();

System.out.println(Math.abs((d1-d2)/(1000*60*60*24)));

3voto

Strom Points 118

Vous pouvez supprimer la troisième instance du calendrier.

GregorianCalendar c1 = new GregorianCalendar();
GregorianCalendar c2 = new GregorianCalendar();
c1.set(2000, 1, 1);
c2.set(2010,1, 1);
c2.add(GregorianCalendar.MILLISECOND, -1 * c1.getTimeInMillis());

3voto

Peter Tillemans Points 20129

Si vous traitez des dates, il est conseillé de consulter la bibliothèque joda time pour un modèle de manipulation des dates plus sain.

http://joda-time.sourceforge.net/

0voto

Luna Kong Points 109

Voici l'approche de base,

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

Date beginDate = dateFormat.parse("2013-11-29");
Date endDate = dateFormat.parse("2013-12-4");

Calendar beginCalendar = Calendar.getInstance();
beginCalendar.setTime(beginDate);

Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endDate);

Il existe un moyen simple de le mettre en œuvre. Nous pouvons utiliser la méthode Calendar.add avec une boucle. Les jours en moins entre beginDate et endDate, et le code mis en œuvre est le suivant ,

int minusDays = 0;
while (true) {
  minusDays++;

  // Day increasing by 1
  beginCalendar.add(Calendar.DAY_OF_MONTH, 1);

  if (dateFormat.format(beginCalendar.getTime()).
            equals(dateFormat.format(endCalendar).getTime())) {
    break;
  }
}
System.out.println("The subtraction between two days is " + (minusDays + 1));**

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X