Un guide pour SimpleDateFormat

Un guide pour SimpleDateFormat

1. introduction

Dans ce didacticiel, nous allons prendre unin-depth tour of the SimpleDateFormat class.

Nous allons jeter un coup d'œil àsimple instantiationand formatting styles ainsi qu'aux méthodes utiles que la classe expose pourhandling locales and time zones.

Maintenant, avant de commencer, gardons à l'esprit queSimpleDateFormat  n'est pas thread-safe. Donc, prendre les précautions appropriées dans des environnements concurrents est laissé aux développeurs.

2. Instanciation simple

Voyons d'abord comment instancier un nouveau objetSimpleDateFormat .

Il y a des4 possible constructors - mais en accord avec le nom, gardons les choses simples. Tout ce dont nous avons besoin pour commencer est unString representation of a date pattern we want.

Commençons par un modèle de date séparé par des tirets comme ceci:

"dd-MM-yyyy"

Cela formatera correctement une date commençant par le jour du mois en cours, le mois en cours de l'année et enfin l'année en cours. Nous pouvons tester notre nouveau formateur avec un simple test unitaire. Nous allons instancier un nouveau sobjectSimpleDateFormat et transmettre une date connue:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
assertEquals("24-05-1977", formatter.format(new Date(233345223232L)));

Dans le code ci-dessus, leformatter convertit les millisecondes enlong  en une date lisible par l'homme - le 24 mai 1977.

2.1. Méthodes d'usine

Bien queSimpleDateFormat soit une classe pratique pour construire rapidement un formateur de date,we’re encouraged to use the factory methods on the DateFormat classgetDateFormat(),getDateTimeFormat(),getTimeFormat().

L'exemple ci-dessus semble un peu différent lorsque vous utilisez ces méthodes d'usine:

DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT);
assertEquals("5/24/77", formatter.format(new Date(233345223232L)));

Comme nous pouvons le voir ci-dessus, le nombre d'options de formatage est prédéterminé par lesfields on the DateFormat class. C'est en grande partierestricts our available options for formatting, c'est pourquoi nous allons nous en tenir àSimpleDateFormat in cet article.

3. Dates d'analyse

SimpleDateFormat andDateFormat not nous permet uniquement de formater les dates - mais nous pouvons également inverser l'opération. En utilisant la méthodeparse , nous pouvonsinput the String representation of a date and return the Date object équivalent:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
Date myDate = new Date(233276400000L);
Date parsedDate = formatter.parse("24-05-1977");
assertEquals(myDate.getTime(), parsedDate.getTime());

Il est important de noter ici que lespattern supplied in the constructor should be in the same format as the date parsed utilisent la méthodeparse .


4. Modèles date-heure

SimpleDateFormat fournit une vaste gamme d'options différentes lors du formatage des dates. Bien que la liste complète soit disponible dans lesJavaDocs, explorons certaines des options les plus couramment utilisées:

Lettre

Composant de date

Exemple

M

Mois

12; déc

y

year

94

d

day

23; lun

H

hour

03

m

minute

57

Lesoutput returned by the date component also depends heavily on the number of characters used dans lesString. Par exemple, prenons le mois de juin. Si nous définissons la chaîne de date comme:

"MM"

Ensuite, notre résultat apparaîtra sous le code numéro - 06. Cependant, si nous ajoutons un autre M à notre chaîne de date:

"MMM"

Ensuite, notre date formatée résultante apparaît sous la forme du motJun.

5. Application des paramètres régionaux

La classeSimpleDateFormat classe égalementsupports a wide range of locales qui est définie lorsque le constructeur est appelé.

Mettons cela en pratique en formatant une date en français. Nous allons instancier un objetSimpleDateFormat tout en fournissantLocale.FRANCE au constructeur.

SimpleDateFormat franceDateFormatter = new SimpleDateFormat("EEEEE dd-MMMMMMM-yyyy", Locale.FRANCE);
Date myWednesday = new Date(1539341312904L);
assertTrue(franceDateFormatter.format(myWednesday).startsWith("vendredi"));

En fournissant une date donnée, un mercredi après-midi, nous pouvons affirmer que notrefranceDateFormatter has a correctement formaté la date. La nouvelle date commence correctement parVendredi -français pour mercredi!

Il vaut la peine de noter une petite erreur dans lesLocale version of the constructor -whilst many locales are supported, full coverage is not guaranteed. Oracle recommande d'utiliser les méthodes d'usine surDateFormat class pour garantir la couverture des paramètres régionaux.

6. Changement de fuseau horaire

PuisqueSimpleDateFormat étend la classeDateFormat , nous pouvons égalementmanipulate the time zone using the setTimeZone method. Jetons un œil à ceci en action:

Date now = new Date();

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE dd-MMM-yy HH:mm:ssZ");

simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Europe/London"));
logger.info(simpleDateFormat.format(now));

simpleDateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
logger.info(simpleDateFormat.format(now));

Dans l'exemple ci-dessus, nous fournissons le mêmeDate ur deux fuseaux horaires différents sur le même objetSimpleDateFormat. Nous avons également ajouté les‘Z' character to the end of the pattern String to indicate the time zone differences. La sortie de la méthodeformat est ensuite enregistrée pour l'utilisateur.

En appuyant sur run, nous pouvons voir les heures actuelles par rapport aux deux fuseaux horaires:

INFO: Friday 12-Oct-18 12:46:14+0100
INFO: Friday 12-Oct-18 07:46:14-0400

7. Sommaire

Dans ce didacticiel, nous avons plongé en profondeur dans les subtilités deSimpleDateFormat.

Nous avons regardé commentinstantiate SimpleDateFormat  ainsi que comment lespattern String impacts how the date is formatted.

Nous avons joué avecchanging the locales de la chaîne de sortie avant d'expérimenter finalement avecusing time zones.

Comme toujours, le code source complet peut être trouvéover on Github.