IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
logo

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.

SommaireDates (17)
pr�c�dent sommaire suivant
 

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.

Mis � jour le 21 juillet 2015 bouye

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.

Mis � jour le 21 juillet 2015 bouye

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�!

Mis � jour le 23 juillet 2015 bouye

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.

Mis � jour le 21 juillet 2015 bouye

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.

Mis � jour le 22 juillet 2015 bouye

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 ISO-8601, c'est-�-dire de facto dans un calendrier gr�gorien proleptique. D'ailleurs, la plupart des classes de base de cette API ne se r�f�rent pas � une classe centrale permettant de manipuler le calendrier comme peut le faire la gestion classique des dates avec la classe Calendar.

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.

Mis � jour le 21 juillet 2015 bouye

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.

Mis � jour le 22 juillet 2015 bouye

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.

Mis � jour le 22 juillet 2015 bouye

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".

Mis � jour le 22 juillet 2015 bouye

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".

Mis � jour le 22 juillet 2015 bouye

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.

Mis � jour le 22 juillet 2015 bouye

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.

Mis � jour le 22 juillet 2015 bouye

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".

Mis � jour le 22 juillet 2015 bouye

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.

Mis � jour le 23 juillet 2015 bouye

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();

Mis � jour le 23 juillet 2015 bouye

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();

Mis � jour le 23 juillet 2015 bouye

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();

Mis � jour le 23 juillet 2015 bouye

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 �a


R�ponse � la question

Liens sous la question
pr�c�dent sommaire suivant
 

Les 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.