1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.joda.time.YearMonth;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class DateDifference {
public static void main(String[] args) {
LocalDate start = new LocalDate(2012, 1, 20);
LocalDate end = new LocalDate(2012, 3, 10);
Map<YearMonth, Integer> daysByMonth = daysByMonthBetween(start, end);
DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("MMMM yyyy").withLocale(Locale.FRENCH);
for (Map.Entry<YearMonth, Integer> e : daysByMonth.entrySet()) {
System.out.printf("%s : %s jours%n", dateFormatter.print(e.getKey()), e.getValue());
}
}
private static Map<YearMonth, Integer> daysByMonthBetween(LocalDate start, LocalDate end) {
if (start.isAfter(end)) {
throw new IllegalArgumentException("start doit être avant end");
}
// Travailler avec des mois est plus facile
YearMonth startMonth = new YearMonth(start);
YearMonth endMonth = new YearMonth(end);
Map<YearMonth, Integer> daysByMonth = new TreeMap<YearMonth, Integer>();
if (startMonth.equals(endMonth)) {
// Si les deux dates sont dans le même mois, c'est facile.
// On rajoute + 1 jour car Joda calcule les temps 'à minuit'. On veut le dernier jour complet.
daysByMonth.put(startMonth, Days.daysBetween(start, end).getDays() + 1);
} else {
// Si les deux dates ne sont pas dans le même mois, on calcule d'abord le nombre de jours jusqu'à la fin du mois
daysByMonth.put(startMonth, Days.daysBetween(start, start.dayOfMonth().withMaximumValue()).getDays() + 1);
for (YearMonth m = startMonth.plusMonths(1); !m.equals(endMonth); m = m.plusMonths(1)) {
// ensuite, pour chaque mois entre les deux, on ajoute le nombre de jours dans celui-ci.
daysByMonth.put(m, Days.daysIn(m.toInterval()).getDays());
}
// Enfin, on ajoute le nombre de jours entre le 1er du mois et la date voulue.
// On rajoute + 1 jour car Joda calcule les temps 'à minuit'. On veut le dernier jour complet.
daysByMonth.put(endMonth, Days.daysBetween(end.dayOfMonth().withMinimumValue(), end).getDays() + 1);
}
return daysByMonth;
}
} |
Partager