
FAQ Langage JavaConsultez toutes les FAQ
Nombre d'auteurs : 42, nombre de questions : 297, derni�re mise � jour : 19 septembre 2017 Ajouter une question
Cette FAQ a �t� r�alis�e � partir des questions fr�quemment pos�es sur le forum Java de http://java.developpez.com ainsi que l'exp�rience personnelle des auteurs.
Nous tenons � souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne pr�tend pas non plus �tre compl�te. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant r�dacteur, lisez ceci.
Sur ce, nous vous souhaitons une bonne lecture.
- Quelle API utiliser pour la gestion du temps en Java ?
- Comment repr�senter une date en Java ?
- Pourquoi est-ce que le mois n'est pas correct lorsque j'utilise un Calendar ?
- Comment repr�senter une dur�e en Java ?
- Comment d�finir une p�riode en Java ?
- Comment repr�senter un calendrier ou une chronologie en Java ?
- Comment convertir une date en cha�ne ?
- Comment convertir une cha�ne en Date ?
- Comment afficher le nom des jours de la semaine ?
- Comment afficher le nom des mois ?
- Comment d�terminer si une ann�e est bissextile ?
- Comment d�terminer si un jour du mois est valide ?
- Comment conna�tre le nombre de jours dans un mois ?
- Comment effectuer des op�rations sur des dates ?
- Comment calculer son �ge � partir d'une date ?
- Comment conna�tre les identifiants possibles des fuseaux horaires ?
- Comment d�finir une date en fonction du fuseau horaire ?
Il existe plusieurs API pour g�rer le temps correctement en Java suivant vos besoins (financier, scientifique, etc.). Nous allons vous pr�senter ici les plus couramment utilis�es�:
API classique Date-Time
Cette API est disponible dans presque toutes les versions de Java�: la classe java.util.Date a fait son apparition d�s le JDK�1.0 tandis que son compl�ment, la classe java.util.Calendar (et ses classes d�riv�es et associ�es telles que java.util.TimeZone pour la gestion des fuseaux horaires) est apparue dans le JDK�1.1. Ces classes offrent une gestion du temps basique et, compte tenu de leur anciennet�, contiennent nombre de m�thodes d�pr�ci�es. Elles sont parfois contre-intuitives � l�utilisation.
Joda-Time
Cette biblioth�que tierce a �t� d�velopp�e par Stephen Colebourne pour pallier les d�fauts et les manques de l'API de gestion du temps incluse du JDK. Il est fortement conseill� de l'utiliser pour toutes les versions de Java ant�rieures au JDK�8 en remplacement de l'API classique Date-Time. � ce jour (07/2015), la derni�re version de Joda-Time requiert au minimum le JDK�5 pour �tre utilis�e.
API java.time
Cette nouvelle API est apparue avec le JDK�8 gr�ce au projet JSR 310: Date and Time API. Elle est fortement inspir�e par Joda-Time�; en effet elle a tout simplement �t� con�ue par le cr�ateur de Joda-Time auquel Oracle a fait appel lorsqu'est venu le temps de repenser l'API de gestion du temps incluse dans le JDK. Cette API n'est cependant pas compl�tement identique, et ce, pour �viter certains d�fauts dans la conception initiale de Joda-Time. Des m�thodes pont ont �t� rajout�es aux classes de l'API classique Date-Time pour permettre de convertir ces valeurs en valeurs utilisables par l'API java.time.
Dans les exemples qui suivent, nous nous attacherons � chaque fois � vous pr�senter les solutions existantes tant pour l'API classique Date-Time que pour la nouvelle API java.time.
Tout d'abord il convient bien de distinguer la notion de date qui repr�sente une date au sens du calendrier (par exemple�: 3 avril 2006) et de temps qui correspond le plus souvent � une ��heure�� dans une journ�e (par exemple�: 15:25:45). Ainsi quand on parle de date Java, il serait plus correct de parler d'instant qui repr�sente un moment sur une ligne temporelle. Et il faut ajouter �galement une notion de fuseau horaire, de changement d'heure pour des questions d��conomie d��nergie, etc. qui permet d'exprimer cet instant dans une valeur humainement compr�hensible. Il existe plusieurs mani�res de repr�senter un instant en Java�:
Nombre
Il est assez courant de repr�senter un instant sous la forme d'un long qui contient le nombre de millisecondes depuis une date d'origine. Ainsi la m�thode System.currentTimeMillis() retourne une date en nombre de millisecondes depuis le 1er janvier�1970 � 00:00:00 GMT�; tandis que la m�thode System.nanoTime() retourne une date en nombre de nanosecondes depuis une origine arbitraire (cette seconde m�thode est surtout utilis�e pour calculer des dur�es).
Code Java : | S�lectionner tout |
long maintenant = System.currentTimeMillis();
Attention, cependant le temps retourn� par ces m�thodes est un temps machine qui ne prend pas en compte des sp�cificit�s du temps universel (secondes suppl�mentaires, etc.).
API classique Date-Time
La classe java.util.Date, pr�sente depuis le JDK�1.0, permet de repr�senter un instant dans un syst�me de calendrier. Il est possible de l'initialiser avec un nombre de millisecondes ou via une instance de la classe java.util.Calendar ou encore par un formateur de dates.
Code Java : | S�lectionner tout |
1 2 | Date maintenant1 = new Date(System.currentTimeMillis()); Date maintenant2 = Calendar.getInstance().getTime(); |
Attention cette classe est mutable, il est donc possible de changer la valeur qu'elle d�finit.
java.sql.Date
Cette classe, qui h�rite de java.util.Date, permet d'utiliser des dates qui peuvent �tre utilis�es avec des requ�tes JDBC sur des bases de donn�es SQL en tant que type SQL DATE. De ce fait, ces dates sont normalis�es, c'est-�-dire que les heures, minutes, secondes et millisecondes stock�es sont toutes mises � z�ro lors de la cr�ation de l'instant.
Avertissement�: cette classe est souvent source de confusion avec sa classe m�re.
API java.time
� partir du JDK�8, il existe plusieurs classes pour repr�senter un instant, une date ou un temps. On peut citer par exemple�:
- java.time.Instant - repr�sente un instant donn�;
- java.time.LocalDate - repr�sente une date sans notion de fuseau horaire (ex.�: le 26 octobre 1984, une date d'anniversaire)�;
- java.time.LocalTime - repr�sente un temps sans notion de fuseau horaire. (ex.�: 15:17, l'heure d'un rendez-vous)�;
- java.time.LocalDateTime - repr�sente une date + temps sans notion de fuseau horaire (ex.�: le 22 mars 2012 � 12:30, le jour et l'heure d'un �v�nement)�;
- java.time.ZonedDateTime - repr�sente une date + temps tout en conservant la notion de fuseau horaire nomm� (ex.�: le 7 novembre 1963 � 22:48, heure de Europe/Paris)�;
- java.time.OffsetTime - repr�sente un temps d�cal� par rapport au fuseau horaire de r�f�rence GMT/Greenwich (ex.�: 09:25 GTM+02:00)�;
- java.time.OffsetDateTime - repr�sente une date + temps d�cal� par rapport au fuseau horaire de r�f�rence GMT/Greenwich (ex.�: le 22 mars 2012 � 12:30 GTM-05:00).
Code Java : | S�lectionner tout |
1 2 3 4 5 | Instant maintenant = Instant.now(); LocalDateTime maintenantIci = LocalDateTime.ofInstant(maintenant, ZoneId.systemDefault()); // L'instant retourn� est exprim� dans votre fuseau horaire. ZonedDateTime maintenantParis = maintenant.atZone(ZoneId.of("Europe/Paris")); // L'instant retourn� est exprim� dans le fuseau horaire de la ville de Paris. LocalDate date1 = LocalDate.of(1983, Month.MARCH, 28); LocalDate date2 = LocalDate.of(1983, 3, 28); // La m�me date. |
Il existe d'autres classes d'emplois plus sp�cialis�s dans l'API java.time pour g�rer des dates�:
- java.time.DayOfWeek - enum qui repr�sente un jour de la semaine (ex.�: mercredi)�;
- java.time.Month - enum qui repr�sente un mois de l�ann�e (ex.�: septembre)�;
- java.time.MonthDay - repr�sente un couple mois + jour, ind�pendamment de l�ann�e (ex.�: le 15 avril)�;
- java.time.Year - repr�sente une ann�e (ex.�: 1998)�;
- java.time.YearMonth - repr�sente un couple ann�e + mois ( ex.�: mars 2007).
Ces classes sont immuables et toute op�ration de modification retourne en fait une nouvelle instance de la classe.
Attention, lorsque vous d�finissez des dates en utilisant l'API classique Date-Time via la classe Calendar, la valeur du mois de janvier est 0 et non pas 1�! Ceci est une source courante d'erreurs et de frustrations.
Code Java : | S�lectionner tout |
1 2 3 | Calendar calendrier = Calendar.getInstance(); calendrier.set(2010, 1, 1); // Erreur: ceci est le 1er f�vrier�!!!!!!!! calendrier.set(2010, 0, 1); // Ceci est le 1er janvier�! |
De mani�re similaire, lorsque vous r�cup�rez le mois courant dans le calendrier, il faut penser � ajouter 1 pour faire vos calculs ou affichages�:
Code Java : | S�lectionner tout |
int mois = calendier.get(Calendar.MONTH) + 1; // Car janvier = 0�!
Attention �galement�: dans la nouvelle API java.time, lorsque vous devez utiliser des valeurs num�riques, le mois de janvier vaut 1 et non pas 0�!
Code Java : | S�lectionner tout |
1 2 | LocalDate date = LocalDate.of(2010, 0, 1); // Erreur�: ceci l�ve une DateTimeException�! LocalDate date = LocalDate.of(2010, 1, 1); // Ceci est le 1er janvier�! |
La dur�e repr�sente le nombre de secondes, millisecondes ou nanosecondes entre deux temps. Il existe plusieurs mani�res de repr�senter des dur�es en Java�:
Nombres
De mani�re traditionnelle, en Java, les dur�es sont souvent repr�sent�es sous la forme de nombres de type int ou long qui contiennent un nombre de secondes, millisecondes ou de nanosecondes. Ainsi, la m�thode System.currentTimeMillis(), qui retourne une date en nombre de millisecondes depuis le 1er janvier 1970, est souvent utilis�e pour faire des calculs de dur�e d�ex�cution.
Par exemple�:
Code Java : | S�lectionner tout |
1 2 3 4 | long debut = System.currentTimeMillis(); // Traitement. long fin = System.currentTimeMillis(); long duree = fin - debut; // Dur�e du traitement en millisecondes. |
� noter toutefois que la valeur retourn�e par l'appel � System.currentTimeMillis() a une granularit� qui d�pend de celle du syst�me d'exploitation sous-jacent,
De la m�me mani�re, System.nanoTime() retourne une date en nanosecondes depuis une origine arbitraire, mais en utilisant une granularit� qui peut �tre plus fine (mais pas obligatoirement), peut �tre �galement utilis�e � cet effet�:
Code Java : | S�lectionner tout |
1 2 3 4 | long debut = System.nanoTime(); // Traitement. long fin = System.nanoTime(); long duree = fin - debut; // Dur�e du traitement en nanosecondes. |
API java.time
Depuis le JDK�8, il est possible d'utiliser la classe java.time.Duration pour repr�senter une dur�e en secondes, mais avec une pr�cision de l'ordre de la nanoseconde. Cette classe stocke en effet deux valeurs sous forme de long�: le nombre de secondes et le nombre de nanosecondes sous la seconde.
On peut donc d�sormais �crire�:
Code Java : | S�lectionner tout |
1 2 3 4 | long debut = System.nanoTime(); // Traitement. long fin = System.nanoTime(); Duration duree = Duration.ofNanos(fin - debut); // Dur�e du traitement en nanosecondes. |
Les dur�es stock�es sont, de plus immuables, et il n'est pas possible de les modifier apr�s leur cr�ation. La classe Duration met cependant � disposition des m�thodes pr�tes � l'emploi permettant de faire des op�rations sur les dur�es.
Par exemple�:
Code Java : | S�lectionner tout |
1 2 3 | Duration duree = Duration.ofMinutes(5) .plusDays(5) .plusHours(2); |
Ici, chaque op�ration provoque la cr�ation d'une nouvelle instance de la classe.
Attention�: une dur�e d'une journ�e fait exactement 24 heures. La dur�e ne tient pas compte du fuseau horaire ou du passage � l'heure d��conomie d��nergie.
Une p�riode d�finit la dur�e entre deux dates en ann�es, mois et jours. De telles p�riodes peuvent �tre, par exemple, utilis�es pour planifier des rendez-vous dans un emploi du temps ou encore calculer le nombre de jours restant jusqu�� une date anniversaire dans un calendrier.
API java.time
Depuis le JDK�8, il est possible de repr�senter des p�riodes entre deux dates dans un calendrier gr�ce � la classe java.time.Period. Cette classe permet de d�finir des p�riodes qui prennent en compte le changement d'heure pour l��conomie d��nergie ou encore des temps locaux sp�cifiques dus aux fuseaux horaires.
Par exemple, pour calculer le nombre de jours d'ici � votre prochain anniversaire�:
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 | LocalDate aujourdhui = LocalDate.now(); LocalDate anniversaire = LocalDate.of(1976, Month.SEPTEMBER, 7); LocalDate prochainAnniversaire = anniversaire.withYear(aujourdhui.getYear()); // Si l'anniversaire a d�j� eu lieu cette ann�e, on rajoute 1 an � la date. if (prochainAnniversaire.isBefore(aujourdhui) || prochainAnniversaire.isEqual(aujourdhui)) { prochainAnniversaire = prochainAnniversaire.plusYears(1); } Period periode = Period.between(aujourdhui, prochainAnniversaire); // P�riode entre les deux indicateurs temporels. long nbJours = ChronoUnit.DAYS.between(aujourdhui, prochainAnniversaire); // Nombre exact de jours entre les deux indicateurs temporels. System.out.printf("Votre prochain anniversaire sera dans %d mois et %d jour(s) (%d jour(s) au total)", periode.getMonths(), periode.getDays(), nbJours).println(); |
Ici, nous utilisons des instances de la classe LocalDate qui ne conservent pas d'information sur le fuseau horaire. Mais si vous �tes n�s dans un fuseau horaire diff�rent de celui dans lequel vous vivez, votre calcul sera plus exact en utilisant des instances de ZonedDateTime pour le calcul de la p�riode.
Attention�: une p�riode d'une journ�e tient compte des modifications du calendrier comme le changement d'heure pour l��conomie d��nergie.
Il existe plusieurs syst�mes de calendrier � travers le monde�: le calendrier gr�gorien utilis� dans le monde occidental, mais �galement le calendrier julien (orthodoxe), copte, h�breu, musulman, chinois, japonais imp�rial, etc. sans parler de calendriers pass�s utilis�s par des civilisations d�sormais �teintes comme le calendrier maya, ou m�me des syst�mes abandonn�s tels que le calendrier r�publicain, etc. Ces syst�mes diff�rents ont tous des concepts diff�rents sur le d�but de l�ann�e, le nombre de mois dans une ann�e, le nombre de jours dans un mois ou encore le nombre de jours dans une semaine ou le premier jour de la semaine. Il existe plusieurs mani�res de manipuler des syst�mes de calendrier dans Java�:
API classique Date-Time
Depuis le JDK�1.1, la classe abstraite java.util.Calendar d�finit des m�thodes g�n�riques d�acc�s et de gestion de calendriers. La classe java.util.GregorianCalendar repr�sente la seule impl�mentation concr�te de cette classe fournie avec le JDK. Elle impl�mente le calendrier gr�gorien proleptique.
Code Java : | S�lectionner tout |
Calendar calendrier = Calendar.getInstance(); // Retourne un calendrier gr�gorien proleptique.
� partir du JDK�8, la liste compl�te des calendriers support�s par le JDK est accessible en invoquant la m�thode Calendar.getAvailableCalendarTypes(). Il est possible d'utiliser le calendrier imp�rial japonais ou le calendrier tha� bouddhiste qui reposent tous deux sur le calendrier gr�gorien en utilisant la classe Calendar.Builder.
Code Java : | S�lectionner tout |
1 2 3 4 | Calendar calendrierImperial = new Calendar.Builder() .setCalendarType("japanese") .setFields(YEAR, 1, DAY_OF_YEAR, 1) .build(); |
Pour utiliser d'autres types de calendriers, vous devrez vous reposer sur des biblioth�ques tierces compatibles avec l'API Calendar.
API java.time
Par d�faut, les instants et dates cr��s avec l'API java.time incluse dans le JDK�8 sont au format

Cependant, le package java.time.chrono contient des classes qui permettent d'utiliser des instants et dates de mani�re plus neutre et ind�pendamment du calendrier ISO. Cette API fournit l�impl�mentation de plusieurs ��chronologies�� pour supporter divers calendriers tels que le calendrier ISO (le calendrier utilis� par d�faut par l'API java.time), le calendrier musulman, le calendrier japonais imp�rial (�res Meiji�6 et ult�rieures), le calendrier chinois de Ta�wan, et le calendrier tha� bouddhiste�:
Code Java : | S�lectionner tout |
1 2 | Locale locale = Locale.forLanguageTag("en-US-u-ca-islamic-umalqura"); Chronology chrono = Chronology.ofLocale(locale); |
La liste compl�te des chronologies support�es par le JDK est accessible en invoquant la m�thode Chronology.getAvailableChronologies().
Pour utiliser d'autres types de chronologies, vous devrez vous reposer sur des biblioth�ques tierces compatibles avec l'API Chronology.
La conversion d'une Date en String est d�licate au premier abord. En effet, le format des dates est tr�s diff�rent d'une langue � l'autre. Heureusement, les fonctions d'internationalisation de Java vont faire le travail � notre place.
API classique Date-Time
Dans l'API classique, cette conversion se fait gr�ce � la classe abstraite java.text.DateFormat.
Code java : | S�lectionner tout |
1 2 3 4 5 | Locale locale = Locale.getDefault(); // Langue actuelle. DateFormat dateFormat1 = DateFormat.getDateInstance(DateFormat.FULL, locale); System.out.println(dateFormat1.format(maDate)); // Ex.�: lundi 1 janvier 2002 DateFormat dateFormat2 = DateFormat.getDateInstance(DateFormat.SHORT , locale); System.out.println(dateFormat2.format(maDate)); // Ex.�: 01/01/2002 |
Si vous souhaitez utiliser un format de sortie plus exotique, vous pouvez acc�der directement � la classe java.text.SimpleDateFormat.
Code java : | S�lectionner tout |
1 2 | DateFormat dateFormat3 = new SimpleDateFormat("hh'h'mm dd-MM-yy"); System.out.println(dateFormat2.format(maDate)); // Ex.�: "23h59 31-12-2000" |
La javadoc de la classe java.text.SimpleDateFormat d�crit le format d'une date, et des lettres � utiliser pour caract�riser le jour, le mois, etc.
API java.time
Les classes permettant de g�rer des dates disposent de la m�thode format() acceptant une instance de la classe java.time.format.DateTimeFormatter qui se chargera de convertir la date re�ue.
Code Java : | S�lectionner tout |
1 2 | String value1 = LocalDate.format(DateTimeFormatter.ISO_LOCAL_DATE); String value2 = LocalDate.format(DateTimeFormatter.ofPattern("d MMM yyyy")); |
La javadoc de la classe java.time.format.DateTimeFormatte d�crit le format d'une date, et des lettres � utiliser pour caract�riser le jour, le mois, etc.
java.util.Formatter
La classe java.util.Formatter ainsi que les classes et m�thodes apparent�es (String.format(), PrintStream.printf()) permettent de formater des dates et temps qui proviennent des API classiques Date-Time ou de la nouvelle API java.time. Ainsi, il est possible de faire�:
Code Java : | S�lectionner tout |
1 2 | System.out.printf("%tT", calendar.getTime()).println(); // Affiche l'heure en utilisant l'API classique Date-Time. System.out.printf("%tT", LocalTime.now()).println(); // Affiche l'heure en utilisant l'API java.time. |
La javadoc de la classe java.util.Formatter d�crit le format d'une date, et des lettres � utiliser pour caract�riser le jour, le mois, etc.
java.text.MessageFormat
La classe java.text.MessageFormat permet de formater des dates qui proviennent de l'API classique Date-Time. Par contre, les dates provenant de l'API java.time ne sont pas support�es.
Code Java : | S�lectionner tout |
System.out.println(MessageFormat.format("{0, time}", calendar.getTime())); // Affiche l'heure en utilisant l'API classique Date-Time.
La javadoc de la classe java.text.MessageFormat d�crit le format d'une date, et des lettres � utiliser pour caract�riser le jour, le mois, etc.
De la m�me mani�re, convertir une cha�ne de caract�res en date d�pend fortement � la fois du format et de la langue utilis�e�:
API classique Date-Time
Depuis le JDK�1.1, pour convertir une instance de String en Date, il faut conna�tre le format de la date. Par d�faut, une seule classe dans l'API g�re les formats de date�: la classe java.text.SimpleDateFormat. On utilise le parser de date pour effectuer la conversion. Voici une m�thode g�n�rique�:
Code java : | S�lectionner tout |
1 2 3 4 | public static Date stringToDate(String sDate, String sFormat) throws Exception { SimpleDateFormat sdf = new SimpleDateFormat(sFormat); return sdf.parse(sDate); } |
Le parser d�clenche une exception de type java.text.ParseException quand la cha�ne ne respecte pas le format. La javadoc de la classe java.text.SimpleDateFormat d�crit le format d'une date, et des lettres � utiliser pour caract�riser le jour, le mois,etc.
API java.time
Les classes permettant de g�rer des dates disposent de plusieurs variantes de la m�thode parse() acceptant une cha�ne de caract�res au format ISO ou une cha�ne quelconque accompagn�e d'une instance de la classe java.time.format.DateTimeFormatter qui se chargera de parser la cha�ne re�ue.
Code Java : | S�lectionner tout |
1 2 3 | LocalDate date1 = LocalDate.parse("1959-07-09"); // Date au format ISO (�quivalent � DateTimeFormatter.ISO_LOCAL_DATE). LocalDate date2 = LocalDate.parse("19590709", DateTimeFormatter.BASIC_ISO_DATE); // Date au format basic ISO. LocalDate date3 = LocalDate.parse(sDate, DateTimeFormatter.ofPattern(sFormat)); // Date avec un format personnalis�. |
Le formateur d�clenche une exception de type java.time.format.DateTimeParseException quand la cha�ne ne respecte pas le format. La javadoc de la classe java.time.format.DateTimeFormatte d�crit le format d'une date, et des lettres � utiliser pour caract�riser le jour, le mois, etc.
API classique Date-Time
La m�thode getDisplayName() de la classe Calendar permet d'obtenir le nom, l�abr�viation ou l'initiale du jour de la semaine en question en fonction d'un style et d'une Locale correspondant � la langue d�sir�e.
Code Java : | S�lectionner tout |
1 2 3 4 5 6 | System.out.println(calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.NARROW_FORMAT, Locale.FRENCH)); // Affiche "L". System.out.println(calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, Locale.FRENCH)); // Affiche "lun." (avec un 'l' minuscule et un '.' � la fin). System.out.println(calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.FRENCH)); // Affiche "lundi" (avec un 'l' minuscule). System.out.println(calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.NARROW_FORMAT, Locale.US)); // Affiche "M". System.out.println(calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, Locale.US)); // Affiche "Mon". System.out.println(calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US)); // Affiche "Monday". |
Il est �galement possible d'utiliser la classe java.text.SimpleDateFormat pour r�cup�rer le nom du jour de la semaine dans une langue sp�cifique�:
Code Java : | S�lectionner tout |
1 2 3 | String value1 = new SimpleDateFormat("E").format(date); // Nom court. String value2 = new SimpleDateFormat("EEE").format(date); // Nom abr�g�. String value3 = new SimpleDateFormat("EEEE").format(date); // Nom long. |
API java.time
� partir du JDK�8, il est possible d'utiliser l'enum java.time.DayOfWeek qui d�finit des constantes pour chacun des sept jours de la semaine. Il est possible d'obtenir le nom, l�abr�viation ou l'initiale du jour de la semaine en question en invoquant la m�thode getDisplayName() de cette classe et en fournissant en param�tre une instance de la classe java.time.format.TextStyle d�finissant le style d�sir� ainsi que la Locale correspondant � la langue d�sir�e.
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 | DayOfWeek lundi = DayOfWeek.MONDAY; System.out.println(lundi.getDisplayName(TextStyle.NARROW, Locale.FRENCH)); // Affiche "L". System.out.println(lundi.getDisplayName(TextStyle.SHORT, Locale.FRENCH)); // Affiche "lun." (avec un 'l' minuscule et un '.' � la fin). System.out.println(lundi.getDisplayName(TextStyle.FULL, Locale.FRENCH)); // Affiche "lundi" (avec un 'l' minuscule). System.out.println(lundi.getDisplayName(TextStyle.NARROW, Locale.US)); // Affiche "M". System.out.println(lundi.getDisplayName(TextStyle.SHORT, Locale.US)); // Affiche "Mon". System.out.println(lundi.getDisplayName(TextStyle.FULL, Locale.US)); // Affiche "Monday". |
API classique Date-Time
La m�thode getDisplayName() de la classe Calendar permet d'obtenir le nom, l�abr�viation ou l'initiale du mois en question en fonction d'un style et d'une Locale correspondant � la langue d�sir�e.
Code Java : | S�lectionner tout |
1 2 3 4 5 6 | System.out.println(calendar.getDisplayName(Calendar.MONTH, Calendar.NARROW_FORMAT, Locale.FRENCH)); // Affiche "F". System.out.println(calendar.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.FRENCH)); // Affiche "f�vr." (avec un 'f' minuscule et un '.' � la fin). System.out.println(calendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.FRENCH)); // Affiche "f�vrier" (avec un 'f' minuscule). System.out.println(calendar.getDisplayName(Calendar.MONTH, Calendar.NARROW_FORMAT, Locale.US)); // Affiche "F". System.out.println(calendar.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.US)); // Affiche "Feb". System.out.println(calendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.US)); // Affiche "February". |
Il est �galement d'utiliser la classe java.text.SimpleDateFormat pour r�cup�rer le nom des mois de l�ann�e dans une langue sp�cifique�:
Code Java : | S�lectionner tout |
1 2 3 | String value1 = new SimpleDateFormat("M").format(date); // Nom court. String value2 = new SimpleDateFormat("MM").format(date); // Nom abr�g�. String value3 = new SimpleDateFormat("MMMM").format(date); // Nom long. |
API java.time
� partir du JDK�8, il est possible d'utiliser l'enum java.time.Month qui d�finit des constantes pour chacun des douze mois de l�ann�e. Il est possible d'obtenir le nom, l�abr�viation ou l'initiale du mois en question en invoquant la m�thode getDisplayName() de cette classe et en fournissant en param�tre une instance de la classe java.time.format.TextStyle d�finissant le style d�sir� ainsi que la Locale correspondant � la langue d�sir�e.
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 | Month fevrier = Month.FEBRUARY; System.out.println(fevrier.getDisplayName(TextStyle.NARROW, Locale.FRENCH)); // Affiche "F". System.out.println(fevrier.getDisplayName(TextStyle.SHORT, Locale.FRENCH)); // Affiche "f�vr." (avec un 'f' minuscule et un '.' � la fin). System.out.println(fevrier.getDisplayName(TextStyle.FULL, Locale.FRENCH)); // Affiche "f�vrier" (avec un 'f' minuscule). System.out.println(fevrier.getDisplayName(TextStyle.NARROW, Locale.US)); // Affiche "F". System.out.println(fevrier.getDisplayName(TextStyle.SHORT, Locale.US)); // Affiche "Feb". System.out.println(fevrier.getDisplayName(TextStyle.FULL, Locale.US)); // Affiche "February". |
Il arrive parfois qu'une ann�e soit bissextile et contienne un jour de plus durant le mois de f�vrier ce qui peut fausser des calculs.
API classique Date-Time
Pour d�terminer si une ann�e est bissextile, vous pouvez invoquer la m�thode isLeapYear() sur une instance de la classe java.util.GregorianCalendar et en lui passant en param�tre l�ann�e � tester . Cette m�thode retourne true si le test r�ussit et false dans le cas contraire.
Code Java : | S�lectionner tout |
1 2 | boolean anneeBissextile = new GregorianCalendar() .isLeapYear(2012); // Vaut true. |
API java.time
� partir du JDK�8, pour d�terminer si une ann�e est bissextile, vous pouvez invoquer la m�thode isLeap() sur une instance de la classe java.time.Year. Cette m�thode retourne true si le test r�ussit et false dans le cas contraire.
Code Java : | S�lectionner tout |
1 2 | boolean anneeBissextile = Year.of(2012) .isLeap(); // Vaut true. |
Compte tenu de l'existence des ann�es bissextiles, certains couples mois + jour, de type java.util.MonthDay peuvent ne pas �tre valides d'une ann�e � une autre.
API java.time
� partir du JDK�8, il est possible de v�rifier si ces dates sont valides en invoquant leur m�thode isValidYear() et en passant en param�tre l�ann�e � tester. Cette m�thode retourne true si le test r�ussit et false dans le cas contraire.
Code Java : | S�lectionner tout |
1 2 | MonthDay date = MonthDay.of(Month.FEBRUARY, 29); boolean jourValide = date.isValidYear(2010); // Vaut false. |
Le nombre de jours du mois de f�vrier peut �tre variable d'une ann�e � une autre si l�une de ces ann�es est bissextile ou pas. De plus, il est toujours pr�f�rable de ne pas se reposer sur des constantes ���crites en dur�� dans le programme.
API classique Date-Time
Il est possible d'invoquer la m�thode getActualMaximum() de la classe java.util.Calendar et en lui passant en param�tre la valeur Calendar.DAY_OF_MONTH pour conna�tre le nombre de jours maximum du mois courant de l�ann�e courante du calendrier.
Code Java : | S�lectionner tout |
1 2 3 4 5 6 | Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, 2010); calendar.set(Calendar.MONTH, Calendar.FEBRUARY); int jours1 = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); // Vaut 28 calendar.set(Calendar.YEAR, 2012); int jours2 = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); // Vaut 29 |
API java.time
� partir du JDK�8, il est possible de connaitre le nombre de jours dans un mois en invoquant la m�thode lengthOfMonth() d'un couple ann�e + mois contenu dans un objet de type java.time.YearMonth. Ce r�sultat tient compte des ann�es bissextiles.
Code Java : | S�lectionner tout |
1 2 3 4 | YearMonth date1 = YearMonth.of(2010, Month.FEBRUARY); System.out.printf("%s: %d", date1, date1.lengthOfMonth()).println(); // Affiche "2010-02: 28". YearMonth date2 = YearMonth.of(2012, Month.FEBRUARY); System.out.printf("%s: %d", date2, date2.lengthOfMonth()).println(); // Affiche "2012-02: 29". |
API java.time
� partir du JDK�8, la nouvelle API permet de faire tr�s facilement des op�rations sur les dates, le temps et les instants. Chaque classe de date dispose d�op�randes permettant de composer de nouvelles valeurs ou de convertir d'un type vers un autre en utilisant une syntaxe fluent.
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | LocalDate aujourdhui = LocalDate.now(); LocalDate demain = aujourdhui.plusDays(1); LocalDate hier = aujourdhui.minusDays(1); LocalDate dansUnMois = aujourdhui.plusMonths(1); // Calcule correctement les jours du mois. System.out.println(aujourdhui); System.out.println(demain); System.out.println(hier); System.out.println(dansUnMois); LocalDateTime maintenant = LocalDateTime.now(); LocalDateTime avant = maintenant.minusHours(4) .plusMinutes(30) .minusWeeks(7); System.out.println(maintenant); System.out.println(avant); |
L'API calcule correctement la notion humaine d�ann�e ou de mois pour retourner le r�sultat attendu�:
Code Java : | S�lectionner tout |
1 2 3 4 | LocalDate date1 = LocalDate.of(2012, Month.JANUARY, 31); // 31 janvier 2012. LocalDate date2 = date1.plusMonths(1); // 29 f�vrier 2012 (ann�e bissextile). LocalDate date3 = date1.plusMonths(2); // 31 mars 2012. LocalDate date4 = date1.plusMonths(3); // 30 avril 2012. |
Attention�: les classes de l'API �tant immuables, chaque op�ration entra�ne la construction d'un nouvel objet.
API classique Date-Time
Il faut effectuer un calcul assez fastidieux entre deux calendriers mis aux dates correctes�:
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | Date naissance = new SimpleDateFormat("yyyy-MM-dd").parse("1976-09-07"); int annees = 0; int mois = 0; int jours = 0; // Calendrier pour la naissance. Calendar calendrierNaissance = Calendar.getInstance(); calendrierNaissance.setTimeInMillis(naissance.getTime()); // Calendrier pour le jour courant. long maintenant = System.currentTimeMillis(); Calendar calendrierMaintenant = Calendar.getInstance(); calendrierMaintenant.setTimeInMillis(maintenant); // Calcul du nombre d�ann�es. annees = calendrierMaintenant.get(Calendar.YEAR) - calendrierNaissance.get(Calendar.YEAR); int moisMaintenant = calendrierMaintenant.get(Calendar.MONTH) + 1; int moisNaissance = calendrierNaissance.get(Calendar.MONTH) + 1; // Calcul du nombre de mois. mois = moisMaintenant - moisNaissance; // Si la diff�rence est n�gative, r�duire l�ann�e de 1 et calculer le nombre de mois. if (mois < 0) { annees--; mois = 12 - moisNaissance + moisMaintenant; if (calendrierMaintenant.get(Calendar.DATE) < calendrierNaissance.get(Calendar.DATE)) { mois--; } } else if (mois == 0 && calendrierMaintenant.get(Calendar.DATE) < calendrierNaissance.get(Calendar.DATE)) { annees--; mois = 11; } // Calcul du nombre de jours. if (calendrierMaintenant.get(Calendar.DATE) > calendrierNaissance.get(Calendar.DATE)) { jours = calendrierMaintenant.get(Calendar.DATE) - calendrierNaissance.get(Calendar.DATE); } else if (calendrierMaintenant.get(Calendar.DATE) < calendrierNaissance.get(Calendar.DATE)) { int aujourdhui = calendrierMaintenant.get(Calendar.DAY_OF_MONTH); calendrierMaintenant.add(Calendar.MONTH, -1); jours = calendrierMaintenant.getActualMaximum(Calendar.DAY_OF_MONTH) - calendrierNaissance.get(Calendar.DAY_OF_MONTH) + aujourdhui; } else { jours = 0; if (mois == 12) { annees++; mois = 0; } } System.out.printf("Vous avez %d an(s) (%1$d an(s) %2$d mois %3$d jour(s)) ", annees, mois, jours).println(); |
API java.time
� partir du JDK�8, pour calculer votre �ge, il suffit de calculer une Period entre votre date de naissance et la date du jour.
Code Java : | S�lectionner tout |
1 2 3 4 | LocalDate aujourdhui = LocalDate.now(); LocalDate naissance = LocalDate.of(1976, Month.SEPTEMBER, 7); Period periode = Period.between(naissance, aujourdhui); System.out.printf("Vous avez %d an(s) (%1$d an(s) %2$d mois %3$d jour(s)) ", periode.getYears(), periode.getMonths(), periode.getDays()).println(); |
API classique Date-Time
Pour conna�tre la liste des identifiants des fuseaux horaires, vous devez invoquer la m�thode statique getAvailableIDs() de la classe java.util.TimeZone. Cette m�thode retourne une instance de String[].
Code Java : | S�lectionner tout |
String[] idFuseauxHoraires = TimeZone.getAvailableIDs();
API java.time
Pour connaitre la liste des identifiants des fuseaux horaires, vous devez invoquer la m�thode statique getAvailableZoneIds() de la classe java.time.ZoneId. Cette m�thode retourne une instance de Set<String> modifiable et non ordonn�e qui est une copie de la d�finition interne.
Code Java : | S�lectionner tout |
Set<String> idFuseauxHoraires = ZoneId.getAvailableZoneIds();
La gestion des fuseaux horaires devient importante lorsque vous devez interagir avec des dates relev�es � divers lieux de la plan�te et qui ne sont pas forcement toutes exprim�es dans le m�me r�f�rentiel. Par exemple, si vous planifiez un voyage, il est important de ne pas se tromper sur les dates de d�part et d�arriv�e d'un vol�!
API Date-Time
Lorsque la date est cr��e � partir d'une instance de Calendar, il est possible de sp�cifier un fuseau horaire sur le calendrier en utilisant la classe java.util.TimeZone. Lors de la cr�ation du fuseau horaire, vous pouvez fournir soit un des noms conventionnels du fuseau horaire (ex.�: "Europe/Paris") soit un d�calage horaire par rapport au fuseau horaire de r�f�rence GMT (ex.�: "GMT+1");
Code Java : | S�lectionner tout |
1 2 3 4 5 6 | Calendar calendrier = Calendar.getInstance(); calendrier.setTimeZone(TimeZone.getTimeZone("Pacific Standard Time")); // Le fuseau horaire est celui de la c�te Ouest nord-am�ricaine. calendrier.set(2010, 4, 23, 9, 1, 2); // 0 est le mois de janvier. calendrier.set(Calendar.MILLISECOND, 0); Date date = calendrier.getTime(); System.out.printf("%tc", date).println(); // La date sera imprim�e dans votre fuseau horaire actuel, le jour et l'heure affich�s peuvent donc appara�tre diff�rents de ceux saisis plus haut. |
Lorsque la date est cr��e � partir d'une cha�ne de caract�res, il est possible de sp�cifier le fuseau horaire sur le formateur�:
Code Java : | S�lectionner tout |
1 2 3 4 | SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); format.setTimeZone(TimeZone.getTimeZone("Pacific Standard Time")); // Le fuseau horaire est celui de la c�te Ouest nord-am�ricaine. Date date = format.parse("2010-05-23T09:01:02"); System.out.printf("%tc", date).println(); // La date sera imprim�e dans votre fuseau horaire actuel, le jour et l'heure affich�s peuvent donc appara�tre diff�rents de ceux saisis plus haut. |
Il est �galement possible de sp�cifier le fuseau horaire dans le format�:
Code Java : | S�lectionner tout |
1 2 3 | SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss z"); Date date = format.parse("2010-05-23T09:01:02 Pacific Standard Time"); // Le fuseau horaire est celui de la c�te Ouest nord-am�ricaine. System.out.printf("%tc", date).println(); // La date sera imprim�e dans votre fuseau horaire actuel, le jour et l'heure affich�s peuvent donc appara�tre diff�rents de ceux saisis plus haut. |
API java.time
� partir du JDK�8, il est possible de stocker des dates contenant des informations de fuseau horaire dans les classes OffsetTime et OffsetDateTime et ZoneDateTime tandis que les d�finitions des fuseaux horaires sont stock�es dans la classe ZoneId.
Code Java : | S�lectionner tout |
1 2 3 4 | ZoneId zoneId = ZoneId.of("America/Los_Angeles"); // Ou�: // ZoneId zoneId = ZoneId.of("PST", ZoneId.SHORT_IDS); ZonedDateTime date = ZonedDateTime.of(1995, 10, 8, 15, 20, 50, 0, zoneId); |
Il est possible de construire une ZonedDateTime � partir d'un Instant ou d'une LocalDateTime en lui affectant un fuseau horaire nomm�:
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | ZoneId zoneId = ZoneId.of("America/Los_Angeles"); Instant maintenant = Instant.now(); ZonedDateTime maintenantLA = maintenant.atZone(zoneId); // Ou�: // ZonedDateTime maintenantLA = ZonedDateTime.ofInstant(maintenant, zoneId); System.out.println(maintenant); System.out.println(maintenantLA); LocalDateTime dateBase = LocalDateTime.parse("2010-05-23T09:01:02"); ZonedDateTime dateLA = baseDate.atZone(zoneId); // Ou�: // ZonedDateTime dateLA = ZonedDateTime.of(baseDate, zoneId); System.out.println(dateBase ); System.out.println(dateLA ); |
Il est �galement possible de parser directement une cha�ne de caract�res contenant une information sur le fuseau horaire�:
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 | // Format ISO ZonedDateTime zonedDate = ZonedDateTime.parse("2010-05-23T09:01:02-07:00[America/Los_Angeles]"); OffsetDateTime offsetDate = OffsetDateTime.parse("2010-05-23T09:01:02-07:00"); System.out.println(zonedDate); System.out.println(offsetDate); // Formats personnalis�s. ZonedDateTime dateFormatPerso1 = ZonedDateTime.parse("2010-05-23 09:01:02 America/Los_Angeles", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV")); ZonedDateTime dateFormatPerso2 = ZonedDateTime.parse("2010-05-23 09:01:02 Pacific Standard Time", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss zzzz")); System.out.println(dateFormatPerso1); System.out.println(dateFormatPerso2); |
Ici, offsetDate ne conserve que l'information de d�calage par rapport au fuseau horaire de r�f�rence�; le passage � l'heure d��conomie d��nergie n'est donc pas pris en compte.
Code Java : | S�lectionner tout |
Set<String> idFuseauxHoraires = ZoneId.getAvailableZoneIds();
Proposer une nouvelle r�ponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plut�t sur le forum de la rubrique pour �aLes sources pr�sent�es sur cette page sont libres de droits et vous pouvez les utiliser � votre convenance. Par contre, la page de pr�sentation constitue une �uvre intellectuelle prot�g�e par les droits d'auteur. Copyright � 2025 Developpez Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'� trois ans de prison et jusqu'� 300 000 � de dommages et int�r�ts.