Obtenir le numéro de la semaine à partir de n'importe quelle date

1. Introduction

Dans cet article, nous allons étudier plusieurs options que nous pouvons utiliser en Java pour obtenir le numéro de semaine pour une date donnée. Nous commencerons par examiner quelques options pour le code hérité utilisant des classes antérieures à Java 8. Ensuite, nous examinerons la nouvelle API Date Time dans le package java.time qui a été introduit dans Java 8.

2. Avant Java 8

Avant Java 8, les calculs de date et d'heure étaient principalement effectués à l'aide des classes Date et Calendar . En règle générale, nous créons un calendrier , puis il est possible d'en extraire les informations dont nous avons besoin en utilisant différentes constantes.

2.1. Obtenir le numéro de la semaine à l'aide des champs du calendrier

Regardons notre premier exemple:

Calendar calendar = Calendar.getInstance(locale); calendar.set(year, month, day); int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);

Nous créons simplement une instance de calendrier pour les paramètres régionaux donnés et définissons l'année, le mois et le jour, et enfin, nous obtenons le champ WEEK_OF_YEAR de l' objet de calendrier . Cela renverra le numéro de la semaine dans l'année en cours.

Voyons maintenant comment invoquer cette méthode à partir de l'un de nos tests unitaires:

@Test public void givenDateUsingFieldsAndLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { Calendar calendar = Calendar.getInstance(Locale.ITALY); calendar.set(2020, 10, 22); assertEquals(47, calendar.get(Calendar.WEEK_OF_YEAR)); }

Nous devons être prudents lors de l'adoption de cette approche, car le champ mois de la classe Calendar est basé sur zéro. Cela signifie que si nous voulons spécifier décembre, nous devons utiliser le nombre 11, ce qui peut souvent prêter à confusion.

2.2. Obtenir le numéro de semaine à l'aide des paramètres régionaux

Dans cet avant-dernier exemple, nous allons examiner les effets de l'application de certains paramètres supplémentaires à notre calendrier :

Calendar calendar = Calendar.getInstance(); calendar.setFirstDayOfWeek(firstDayOfWeek); calendar.setMinimalDaysInFirstWeek(minimalDaysInFirstWeek); calendar.set(year, month, day); int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR); 

La classe Calendar définit deux méthodes:

  • setFirstDayOfWeek
  • setMinimalDaysInFirstWeek

Ces méthodes ont un impact sur la façon dont nous calculons le numéro de semaine. Normalement, ces deux valeurs proviennent des paramètres régionaux lors de la création du calendrier . Mais il est également possible de définir manuellement le premier jour de la semaine et les jours minimaux de la première semaine de l'année.

2.3. Différences locales

Les paramètres régionaux jouent un rôle important dans le calcul du numéro de semaine:

@Test public void givenDateUsingFieldsAndLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly() { Calendar calendar = Calendar.getInstance(Locale.CANADA); calendar.set(2020, 10, 22); assertEquals(48, calendar.get(Calendar.WEEK_OF_YEAR)); } 

Dans ce test unitaire, nous avons seulement changé les paramètres régionaux du calendrier pour utiliser Locale.CANADA au lieu de Locale.ITALY et maintenant le numéro de semaine renvoyé est 48 au lieu de 47 .

Les deux résultats sont corrects. Comme mentionné précédemment, cela se produit parce que chaque Locale a des paramètres différents pour la setFirstDayOfWeek et setMinimalDaysInFirstWeek méthodes .

3. Java 8 Date Heure API

Java 8 a introduit de nouvelles API pour la date et l' heure afin de remédier aux lacunes des anciens java.util.Date et java.util.Calendar .

Dans cette section, nous examinerons quelques options pour obtenir le numéro de semaine à partir de la date à l'aide de cette nouvelle API.

3.1. Obtenir le numéro de la semaine à l'aide des valeurs numériques

De même, comme nous l'avons vu précédemment avec Calendar , nous pouvons également transmettre les valeurs d'année, de mois et de jour directement dans LocalDate :

LocalDate date = LocalDate.of(year, month, day); int weekOfYear = date.get(WeekFields.of(locale).weekOfYear()); 

L'avantage par rapport à nos exemples pré-Java 8 est que nous n'avons pas le problème du champ du mois étant basé sur zéro.

3.2. Obtenir le numéro de la semaine à l'aide de Chronofield

Dans ce dernier exemple, nous verrons comment utiliser l' énumération ChronoField , qui implémente l' interface TemporalField :

LocalDate date = LocalDate.of(year, month, day); int weekOfYear = date.get(ChronoField.ALIGNED_WEEK_OF_YEAR); 

Cet exemple est similaire à l'utilisation de la constante Calendar.WEEK_OF_YEAR int que nous avons vue précédemment, mais à l'aide de ChronoField.ALIGNED_WEEK_OF_YEAR .

4. Conclusion

Dans ce rapide didacticiel, nous avons illustré plusieurs façons d'obtenir le numéro de semaine à partir d'une date en utilisant Java brut.

Comme toujours, le code source complet de l'article est disponible à l'adresse over sur GitHub.