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 :
- La plupart des méthodes sont obsolètes
- Ne prend pas en charge l'internationalisation
- 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
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
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 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
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 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
Vous pouvez également utiliser lagetTime()méthode pour le convertir en objet Date :
Exemple
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
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
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
Exemple complet
Exemple
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
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.
Mutabilité: Les objets Calendar sont mutables ; modifier un objet Calendar affecte tous les emplacements qui y font référence.
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.
Performance: La création fréquente d'instances de Calendar affecte les performances ; envisagez de réutiliser les instances.
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
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)) |