Migrer de Calendar vers ZonedDateTime & LocalDateTime

Je me suis lancé dans un projet de suppression de l’utilisation des objets Date et Calendar, au sein des projets Java sur lesquels je travaille. En effet, Java 8 contient maintenant une API avec des objets de date réellement propres (ENFIN), ET threadsafe (ce qui n’était pas le cas jusque là). Donc il n’y a aucune raison pour ne pas l’utiliser.

J’ai fais ci-dessous un petit listing des différences entre l’utilisation des objets Calendar et LocalDateTime/ZonedDateTime.

Création d’un object de base :

Calendar calendar = Calendar.getInstance();
format.setTimeZone(TimeZone.getTimeZone("Europe/Paris"));

ZoneId zoneId = ZoneId.of("Europe/Paris");

LocalDateTime localDateTime = LocalDateTime.now();
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zoneId);
zonedDateTime.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);

Récupération du numéro de la semaine en cours :

int nWeeksInYearsCalendar = calendar.get(Calendar.WEEK_OF_YEAR);
int nWeeksInYearsZonedDate = zonedDateTime.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);

Placement sur le premier jour de la semaine :

calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
zonedDateTime = zonedDateTime.with(DayOfWeek.MONDAY);

Ajout/Suppression de semaine :

calendar.add(Calendar.WEEK_OF_YEAR, 1);
calendar.add(Calendar.WEEK_OF_YEAR, -2);

zonedDateTime = zonedDateTime.plus(1, ChronoUnit.WEEKS);
zonedDateTime = zonedDateTime.plus(-2, ChronoUnit.WEEKS);

Transformation en une String de type

SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy", Locale.FRANCE);
format.format(calendar.getTime());

zonedDateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));

Printing des douze mois en français

Calendar calendar = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("MMMM", Locale.FRANCE);
for (int n = 0; n < 12; n++) {
    System.out.println(String.valueOf(-1 * n) + " : " + format.format(calendar.getTime()));
	calendar.add(Calendar.MONTH, -1);
}

LocalDateTime localDateTime = LocalDateTime.now();

LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
for (int n = 0; n < 12; n++) {
    System.out.println(String.valueOf(-1 * n) + " : " + localDateTime.format(DateTimeFormatter.ofPattern("MMMM", Locale.FRANCE)));
    localDateTime = localDateTime.plus(-1, ChronoUnit.MONTHS);
}

De Date à LocalDateTime à Date

Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());

Différence d’heure entre deux LocalDateTime

long diffHours = pastDate.until(LocalDateTime.now(), ChronoUnit.HOURS);
long diffHours2 = ChronoUnit.HOURS.between(pastDate, LocalDateTime.now());

LocalDate to date

Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());