Classe Calendar de Java

La classe Calendar est une classe abstraite en Java pour gérer les dates et les heures. Elle se trouve dans lejava.utilpackage. Cette classe fournit une série de méthodes pour manipuler les champs de date et d'heure (tels que l'année, le mois, le jour, l'heure, la minute, etc.), et peut effectuer des calculs et des comparaisons de dates.

Pourquoi avons-nous besoin de la classe Calendar ?

En Java, bien que la classe Date puisse également représenter des dates et des heures, elle présente les limitations suivantes :

  1. La plupart des méthodes sont obsolètes
  2. Ne prend pas en charge l'internationalisation
  3. Fonctionnalités de calcul de date limitées

La classe Calendar résout ces problèmes et offre des capacités de manipulation de date et d'heure plus puissantes et plus flexibles.


Utilisation de base de la classe Calendar

Obtenir une instance de Calendar

Comme Calendar est une classe abstraite, nous ne pouvons pas l'instancier directement. La méthode standard pour obtenir une instance de Calendar est :

Exemple

Calendar calendar = Calendar.getInstance();

Cette méthode renvoie une instance de Calendar (généralement GregorianCalendar) en fonction du fuseau horaire et des paramètres régionaux par défaut.

Définition de la date et de l'heure

Nous pouvons utiliser laset()méthode pour définir les différents champs d'un objet Calendar :

Exemple

// Définir l'année, le mois et le jour
calendar.set(2023, Calendar.NOVEMBER, 15);

// Définir l'année, le mois, le jour, l'heure, la minute et la seconde
calendar.set(2023, Calendar.NOVEMBER, 15, 14, 30, 0);

Remarque : les mois sont indexés à partir de 0, où 0 représente janvier et 11 représente décembre. Pour éviter toute confusion, il est recommandé d'utiliser les constantes définies dans la classe Calendar (par exemple, Calendar.JANUARY, Calendar.FEBRUARY, etc.).

Obtention d'informations sur la date et l'heure

Utilisez laget()méthode pour obtenir les différents champs d'un objet Calendar :

Exemple

int year = calendar.get(Calendar.YEAR);       // Obtenir l'année
int month = calendar.get(Calendar.MONTH);     // Obtenir le mois (0-11)
int day = calendar.get(Calendar.DAY_OF_MONTH);// Obtenir le jour
int hour = calendar.get(Calendar.HOUR_OF_DAY);// Obtenir l'heure (format 24 heures)
int minute = calendar.get(Calendar.MINUTE);   // Obtenir la minute
int second = calendar.get(Calendar.SECOND);   // Obtenir la seconde

Méthodes courantes de la classe Calendar

Calcul de date

La classe Calendar fournit des méthodes pratiques de calcul de date :

Exemple

// Ajouter 10 jours à la date actuelle
calendar.add(Calendar.DAY_OF_MONTH, 10);

// Soustraire 3 mois du mois actuel
calendar.add(Calendar.MONTH, -3);

Comparaison de dates

Nous pouvons utiliser lacompareTo()méthode pour comparer deux objets Calendar :

Exemple

Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal2.add(Calendar.DAY_OF_MONTH, 1);

int result = cal1.compareTo(cal2);
// result < 0 indique que cal1 est antérieur à cal2
// result == 0 indique que cal1 est égal à cal2
// result > 0 indique que cal1 est postérieur à cal2

Obtention d'un horodatage

Vous pouvez utiliser lagetTimeInMillis()méthode pour obtenir l'horodatage (en millisecondes) représenté par un objet Calendar :

Exemple

long timestamp = calendar.getTimeInMillis();

Vous pouvez également utiliser lagetTime()méthode pour le convertir en objet Date :

Exemple

Date date = calendar.getTime();

Utilisation avancée de la classe Calendar

Définition du fuseau horaire

Nous pouvons définir un fuseau horaire spécifique pour un objet Calendar :

Exemple

TimeZone timeZone = TimeZone.getTimeZone("America/New_York");
calendar.setTimeZone(timeZone);

Opérations sur les champs de Calendar

La classe Calendar fournit laroll()méthode, qui peut faire rouler un champ sans affecter les autres champs :

Exemple

// Ajouter 1 au mois, mais ne pas changer l'année
calendar.roll(Calendar.MONTH, true);  // Ou calendar.roll(Calendar.MONTH, 1);

Obtenir le premier jour de la semaine

Différentes régions définissent le premier jour de la semaine différemment (certaines utilisent dimanche, d'autres lundi) :

Exemple

int firstDayOfWeek = calendar.getFirstDayOfWeek();

Exemple complet

Exemple

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;

public class CalendarDemo {
    public static void main(String[] args) {
        // 1. Obtenir une instance de Calendar (utilise la date et l'heure actuelles par défaut)
        Calendar calendar = Calendar.getInstance();
       
        // 2. Obtenir les valeurs de différents champs
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1; // Le mois est basé sur 0, donc ajoutez 1
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int hour = calendar.get(Calendar.HOUR_OF_DAY); // format 24 heures
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);
       
        System.out.printf("Heure actuelle : %d année %d mois %d jour %d:%d:%d%n",
                        year, month, day, hour, minute, second);
       
        // 3. Définir une date et une heure spécifiques
        calendar.set(2023, Calendar.MAY, 15, 10, 30, 0); // 15 mai 2023 10:30:00
       
        // 4. Utiliser SimpleDateFormat pour une sortie formatée
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Heure après le réglage : " + sdf.format(calendar.getTime()));
       
        // 5. Arithmétique des dates
        calendar.add(Calendar.DAY_OF_MONTH, 5); // Ajouter 5 jours
        calendar.add(Calendar.HOUR, -3); // Soustraire 3 heures
       
        System.out.println("Heure après calcul : " + sdf.format(calendar.getTime()));
       
        // 6. Comparer les dates
        Calendar anotherCalendar = new GregorianCalendar(2023, Calendar.JUNE, 1);
        System.out.println("Résultat de la comparaison : " +
            (calendar.before(anotherCalendar) ? "avant" : "après"));
       
        // 7. Obtenir le jour de la semaine (dimanche=1, samedi=7)
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
        System.out.println("Jour de la semaine" + getChineseWeekday(dayOfWeek));
    }
   
    private static String getChineseWeekday(int dayOfWeek) {
        String[] weekdays = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
        return weekdays[dayOfWeek];
    }
}

Résultat de sortie :

当前时间: 2023年5月15日 14:25:36
设置后的时间: 2023-05-15 10:30:00
运算后的时间: 2023-05-20 07:30:00
比较结果: 之前
星期二

Remarques sur la classe Calendar

  1. Les mois sont indexés à partir de 0: Dans la classe Calendar, les mois sont indexés à partir de 0 (0=janvier, 11=décembre), ce qui peut facilement entraîner des erreurs.

  2. Mutabilité: Les objets Calendar sont mutables ; modifier un objet Calendar affecte tous les emplacements qui y font référence.

  3. Sécurité des threads: La classe Calendar n'est pas sûre pour les threads, et une synchronisation supplémentaire est nécessaire dans les environnements multithread.

  4. Performance: La création fréquente d'instances de Calendar affecte les performances ; envisagez de réutiliser les instances.

  5. Problèmes de fuseau horaire: Le fuseau horaire du système est utilisé par défaut, et une attention particulière est nécessaire pour les applications multi-fuseaux horaires.


Alternative en Java 8

À partir de Java 8, une nouvelle API de date et d'heure (lejava.timepackage) a été introduit, offrant une manière plus moderne et plus facile à utiliser pour gérer les dates et les heures. Si vous utilisez Java 8 ou une version ultérieure, il est recommandé de préférer la nouvelle API :

Exemple

// Nouvelle API pour remplacer Calendar
LocalDate date = LocalDate.now();
LocalDateTime dateTime = LocalDateTime.now();
ZonedDateTime zonedDateTime = ZonedDateTime.now();

La nouvelle API résout de nombreux problèmes de la classe Calendar, notamment une meilleure sécurité des threads, une conception d'API plus intuitive et des fonctionnalités plus puissantes.


Méthodes courantes de la classe Java Calendar

Voici les méthodes courantes de la classe java.util.Calendar :

Méthodes de base

Méthode Description Exemple
static Calendar getInstance() Obtient une instance de Calendar avec le fuseau horaire et les paramètres régionaux par défaut Calendar cal = Calendar.getInstance()
static Calendar getInstance(TimeZone zone) Obtient une instance de Calendar avec le fuseau horaire spécifié Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"))
static Calendar getInstance(Locale locale) Obtient une instance de Calendar avec les paramètres régionaux spécifiés Calendar cal = Calendar.getInstance(Locale.CHINA)
static Calendar getInstance(TimeZone zone, Locale locale) Obtient une instance de Calendar avec le fuseau horaire et les paramètres régionaux spécifiés Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"), Locale.CHINA)

Constantes de champ (courantes)

Champ Description Plage de valeurs
Calendar.YEAR Champ année -
Calendar.MONTH Champ mois 0-11 (0 signifie janvier)
Calendar.DATEouCalendar.DAY_OF_MONTH Nombre de jours dans le mois 1-31
Calendar.DAY_OF_WEEK Jour de la semaine 1-7 (1 signifie dimanche)
Calendar.HOUR Heure au format 12 heures 0-11
Calendar.HOUR_OF_DAY Heure au format 24 heures 0-23
Calendar.MINUTE Minutes 0-59
Calendar.SECOND second 0-59
Calendar.MILLISECOND Millisecondes 0-999
Calendar.AM_PM AM ou PM 0 (AM) ou 1 (PM)

Méthodes d'opération date-heure

Méthode Description Exemple
int get(int field) Obtenir la valeur du champ spécifié int year = cal.get(Calendar.YEAR)
void set(int field, int value) Définir la valeur du champ spécifié cal.set(Calendar.MONTH, 5)(réglé sur juin)
void set(int year, int month, int date) Définir l'année, le mois, le jour cal.set(2023, 5, 15)(15 juin 2023)
void set(int year, int month, int date, int hourOfDay, int minute) Définir l'année, le mois, le jour, l'heure, la minute cal.set(2023, 5, 15, 14, 30)
void set(int year, int month, int date, int hourOfDay, int minute, int second) Définir l'année, le mois, le jour, l'heure, la minute, la seconde cal.set(2023, 5, 15, 14, 30, 45)
void add(int field, int amount) Ajouter ou soustraire la durée spécifiée cal.add(Calendar.DATE, 5)(ajouter 5 jours)
void roll(int field, int amount) Ajouter ou soustraire une durée sans modifier les champs supérieurs cal.roll(Calendar.DATE, 5)(ne modifie que le champ jour)

Méthodes de comparaison temporelle

Méthode Description Exemple
boolean after(Object when) Déterminer si ce Calendar est postérieur au moment spécifié cal1.after(cal2)
boolean before(Object when) Déterminer si ce Calendar est antérieur au moment spécifié cal1.before(cal2)
int compareTo(Calendar anotherCalendar) Comparer l'ordre chronologique de deux objets cal1.compareTo(cal2)

Autres méthodes utiles

Méthode Description Exemple
long getTimeInMillis() Retourner la valeur de ce Calendar (millisecond) long millis = cal.getTimeInMillis()
void setTimeInMillis(long millis) Définir le Calendar avec la valeur temporelle millisecond donnée cal.setTimeInMillis(1626345600000L)
Date getTime() Retourner un objet Date représentant la valeur temporelle de ce Calendar Date date = cal.getTime()
void setTime(Date date) Définir l'heure du Calendar à l'aide du Date donné cal.setTime(new Date())
void clear() Effacer toutes les valeurs de champ cal.clear()
void clear(int field) Effacer la valeur du champ spécifié cal.clear(Calendar.HOUR)
boolean isSet(int field) Déterminer si le champ spécifié a été défini if(cal.isSet(Calendar.YEAR))
Autres extensions