1. Passer de la Dateclasse à la Calendarclasse

Les programmeurs ont adoré la Dateclasse pour sa simplicité et sa prise en charge des normes Unix, mais comme vous le savez, chaque rose a ses épines.

Les programmeurs voulaient une Dateclasse "intelligente". Et ils ont obtenu ce qu'ils voulaient sous la forme de la Calendarclasse. Il a été conçu comme un moyen non seulement de stocker des dates, mais aussi d'effectuer des opérations difficiles avec des dates.

Le nom complet de la Calendarclasse est java.util.Calendar. N'oubliez pas de l'ajouter à une déclaration d'importation si vous décidez de l'utiliser dans votre code.

Vous pouvez créer un Calendarobjet avec cette commande :

Calendar date = Calendar.getInstance();

getInstance()La méthode statique de la Calendarclasse crée un Calendarobjet initialisé avec la date courante. Le calendrier que vous souhaitez sera créé en fonction des paramètres de l'ordinateur exécutant le programme.

Ou plus précisément, le calendrier que vous obtenez... C'est parce que les humains sur Terre ne sont pas limités à un seul calendrier. Au lieu de cela, ils en utilisent plusieurs. Et presque chacun d'entre eux est associé à une religion ou à un pays. La Calendarclasse en supporte 3 :

Calendrier Description
Calendrier Grégorien Calendrier grégorien chrétien
BouddhisteCalendrier Calendrier bouddhiste
JapaneseImperialCalendrier Calendrier impérial japonais

Mais il existe aussi des calendriers chinois et arabes. Fondamentalement, travailler avec le temps n'est pas aussi facile qu'il n'y paraît.

Dans le calendrier chinois, l'année est officiellement 4716 au moment de la rédaction de cette leçon. Et selon le calendrier musulman, l'année est 1398. Bienvenue dans le grand monde, mon ami programmeur.

2. Créer un objet calendrier

Nous utiliserons le calendrier grégorien, car c'est le plus courant au monde. Au moins jusqu'à ce que la Chine achète Oracle et fasse du calendrier chinois le principal.

Vous pouvez créer un objet calendrier avec n'importe quelle date à l'aide d'une instruction comme celle-ci :

Calendar date = new GregorianCalendar(year, month, day);

Oui, il faut écrire GregorianCalendarà chaque fois. Au lieu de Calendar, vous pouvez également écrire GregorianCalendar- cela fonctionnera également. Mais l'écriture Calendarest juste plus courte.

L'année doit être écrite en entier, par exemple vous ne pouvez pas écrire 19 au lieu de 2019. Les mois sont toujours numérotés à partir de zéro. Mais comme auparavant, les jours du mois ne sont pas numérotés à partir de zéro. Nerds !

Pour définir l'heure ainsi que la date, vous devez passer l'heure comme arguments supplémentaires :

... = new GregorianCalendar(year, month, day, hours, minutes, seconds);

Vous pouvez même passer en millisecondes si nécessaire. Ils sont le paramètre après le nombre de secondes.

3. Afficher un objet calendrier à l'écran

Si vous imprimez simplement un objet calendrier à l'écran, vous ne serez pas très satisfait du résultat.

Code
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Sortie console
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Helsinki",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=118,lastRule=java.util.SimpleTimeZone[id=Europe/Helsinki,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2019,MONTH=3,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=12,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

La chose à garder à l'esprit ici est qu'un calendrier est un calendrier, pas une date : il a toutes sortes de paramètres qui seront tous affichés à l'écran.

Il serait approprié d'utiliser un SimpleDateFormatobjet pour afficher un calendrier, mais jusqu'à ce que nous l'étudions, vous pouvez utiliser ce hack de la vie.

Date date = calendar.getTime();

Un Calendarobjet peut être facilement converti en Dateobjet et vous savez déjà comment afficher un Dateobjet. Vous pouvez utiliser un code comme celui-ci pour convertir un Calendarobjet en un Date:

En utilisant la getTime()méthode :

Code Sortie console
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

C'est une tout autre affaire, n'est-ce pas ?

4. Travailler avec des éléments d'une date

Pour obtenir un élément précis d'une date (par exemple l'année, le mois, ...), la Calendarclasse dispose de la get()méthode. C'est une méthode unique, mais elle a des paramètres :

int month = calendar.get(Calendar.MONTH);

calendarest une Calendarvariable, et MONTHest un champ constant de la Calendarclasse.

Vous passez l'un des Calendarchamps constants de la classe comme argument à la getméthode et vous obtenez la valeur souhaitée comme résultat.

Exemples

Code Description
Calendar calendar = Calendar.getInstance();

int era = calendar.get(Calendar.ERA);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);


ère (avant ou après l'ère commune)
année
mois
jour du mois

jour de la semaine
heures
minutes
secondes

Pour changer un élément d'une date, utilisez la setméthode :

calendar.set(Calendar.MONTH, value);

calendarest une Calendarvariable, et MONTHest un champ constant de la Calendarclasse.

Lorsque vous travaillez avec setla méthode, vous transmettez l'un des Calendarchamps constants de la classe comme premier argument et la nouvelle valeur comme deuxième argument.

Exemples

Code Description
Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DAY_OF_MONTH, 4);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);

System.out.println(calendar.getTime());


année = 2019
mois = juillet (numéroté à partir de 0)
4e jour
heures
minutes
secondes

5. Constantes de la Calendarclasse

Les champs constants de la Calendarclasse ne se limitent pas à ceux permettant de nommer les éléments d'une date. Il semble y avoir des champs pour chaque occasion.

Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);

Par exemple, il existe des champs constants pour faire référence aux mois :

Et aussi les jours de la semaine :

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("It's Friday");
}

Nous ne listerons pas tout. Nous ne voulons simplement pas que vous soyez surpris si vous voyez des constantes comme celle-ci dans le code.

L'utilisation de constantes rend le code plus lisible, c'est pourquoi les programmeurs les utilisent. Et les mois sont numérotés à partir de zéro également pour améliorer la lisibilité. Ou non.

6. Changer la date dans un Calendarobjet

La Calendarclasse a une méthode qui vous permet d'opérer sur une date de manière plus intelligente. Par exemple, vous pouvez ajouter une année, un mois ou plusieurs jours à une date. Ou emportez-les. Cette méthode s'appelle add(). Travailler avec cela ressemble à ceci:

calendar.add(Calendar.MONTH, value);

calendarest une Calendarvariable, et MONTHest un champ constant de la Calendarclasse.

Lorsque vous travaillez avec addla méthode, vous transmettez l'un des Calendarchamps constants de la classe comme premier argument et comme second argument — la nouvelle valeur à ajouter.

C'est une autre méthode intelligente. Voyons à quel point c'est intelligent:

Code
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
Sortie console
Fri Mar 01 00:00:00 EET 2019

Cette méthode comprend qu'il n'y a que 28 jours en février 2019, donc la date résultante est le 1er mars.

Enlevons maintenant 2 mois ! Que devrions-nous obtenir ? 27 décembre 2018 ! Vérifions maintenant.

Pour effectuer une opération qui aboutit à une date antérieure, vous devez transmettre une valeur négative à la add()méthode :

Code
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Sortie console
Thu Dec 27 00:00:00 EET 2018

Ça marche!

Cette méthode tient compte des différentes longueurs de mois ainsi que des années bissextiles. Bref, une excellente méthode. C'est exactement ce dont ont besoin la plupart des programmeurs qui travaillent avec des dates.

7. Éléments roulants d'une date

Mais parfois, il y a des situations où nous ne voulons pas de ce comportement intelligent, par exemple vous voulez faire quelque chose à une partie de la date sans changer tout le reste.

La Calendarclasse a la méthode spéciale roll()pour cela. Sa signature est identique à la add()méthode, mais cette méthode ne modifie qu'un seul élément de la date, laissant le reste inchangé.

Exemple:

Code
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Sortie console
Fri Dec 27 00:00:00 EET 2019

Nous avons changé le mois, mais l'année et la date sont restées inchangées.