Java 8 a introduit une nouvelle API pour gérer les dates. Les opérations de date qui utilisaient la date et le calendrier avec les API standard ont été remplacées par LocalDate, LocalDateTime, etc.
Cette fois, je présenterai l'utilisation simple de LocalDate, les points à noter lors de son utilisation et le fait qu'il y avait une utilisation si pratique. Dans la seconde moitié, nous présenterons les précautions de manipulation, alors jetez un œil à la fin.
Avant Java8, j'ai écrit le code suivant pour obtenir la date actuelle.
Date currentDate1 = new Date();
Calendar currentDate2 = Calendar.getInstance();
Cependant, ce code inclut non seulement la date mais aussi l'heure, donc soyez prudent lorsque vous n'utilisez que la date. Par exemple, si vous souhaitez obtenir des informations entre une certaine date, cette heure l'affectera et vous risquez d'obtenir des données involontaires. Vous devez couper la partie horaire pour éviter les mouvements involontaires.
final LocalDate currentDate = LocalDate.now();
System.out.println(currentDate); // 2020-01-15
Si vous souhaitez utiliser LocalDate pour définir la date actuelle, utilisez la méthode now. Dans le cas de LocalDate, la date est définie et elle ne sera pas traitée après l'heure.
Avant Java8, j'ai écrit du code comme celui-ci pour initialiser par date.
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 11);
calendar.set(Calendar.DAY_OF_MONTH, 25);
Dans ce style d'écriture, le mois commence à 0, donc si vous définissez 11, ce sera décembre. En outre, cela vient aussi avec le temps, il est donc nécessaire de réduire le temps.
LocalDate targetDate = LocalDate.of(2019, 12, 25)
System.out.println(targetDate); // 2019-12-25
Utilisez la méthode of pour effectuer l'initialisation en spécifiant une date. Par rapport à la date et au calendrier, le réglage de la date est plus intuitif et plus facile.
Avant Java8, j'ai écrit un code comme celui-ci pour obtenir la date d'une lettre:
DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
Date date = formatter.parse("2019/12/25");
Vous pouvez passer intuitivement d'une chaîne de caractères à une date telle que vous la voyez. Mais en fait, SimpleDateFormat n'est pas thread-safe. Lors de la création de programmes de threads ou d'applications Web, si vous ne les utilisez pas correctement, la date d'un autre utilisateur sera réécrite.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate targetDate = LocalDate.parse("2019/12/25", formatter);
System.out.println(targetDate); // 2019-12-25
Crée une instance de type LocalDate à partir d'une chaîne de date. DateTimeFormatter Il est sûr car il est thread-safe.
LocalDate targetDate = DateTimeFormatter.ofPattern("yyyy/MM/dd")
.parse("2019/12/25", LocalDate::from);
System.out.println(targetDate); // 2019-12-25
Vous pouvez également écrire du code comme celui-ci. Le code ci-dessus semble bon à première vue, mais il y a un problème.
J'ai imité le code précédent et j'ai écrit le code suivant.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd")
.parse("2020/02/30", LocalDate::from);
System.out.println(targetDate); // 2020-02-29
En février 2020, il n'y avait que 29 jours, et même si vous avez spécifié 30 jours, aucune erreur ne s'est produite et elle a été convertie en 29 jours sans autorisation. Cela peut sembler pratique à première vue, mais cela ne convient pas pour une vérification et une conversion précises de la date. Par conséquent, réécrivez comme suit.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd")
.withResolverStyle(ResolverStyle.STRICT)
.parse("2020/02/30", LocalDate::from);
System.out.println(targetDate); //Il y a une exception
La définition de ResolverStyle.STRICT résout strictement la date afin qu'une exception soit déclenchée si la date est incorrecte.
J'ai légèrement modifié le programme précédent et créé une version sans barres obliques dans la chaîne de date.
LocalDate targetDate = DateTimeFormatter.ofPattern("yyyyMMdd")
.withResolverStyle(ResolverStyle.STRICT)
.parse("20191225", LocalDate::from);
System.out.println(targetDate); // ???
Ce code semble correct, mais j'obtiens une exception sur la sortie.
DateTimeFormatter (Java Platform SE 8)
En regardant le document ci-dessus, il est écrit comme suit.
Symbol | Meaning | Presentation | Examples |
---|---|---|---|
g | era | text | AD; Anno Domini; A |
u | year | year | 2004; 04 |
y | year-of-era | year | 2004; 04 |
Le symbole de format y est étiqueté année de l'ère. L'ère représente le calendrier, et comme la date était gérée strictement par STRICT auparavant, le calendrier n'a pas pu être déterminé et une erreur s'est produite.
LocalDate targetDate = DateTimeFormatter.ofPattern("uuuuMMdd")
.withResolverStyle(ResolverStyle.STRICT)
.parse("20191225", LocalDate::from);
System.out.println(targetDate); // 2019-12-25
J'ai changé le symbole de y en u et la conversion de la date a réussi.
LocalDate targetDate = DateTimeFormatter.ofPattern("GGGGyy année MM mois jj jour")
.withLocale(Locale.JAPAN)
.withChronology(JapaneseChronology.INSTANCE)
.withResolverStyle(ResolverStyle.STRICT)
.parse("25 décembre 2018", LocalDate::from);
System.out.println(targetDate); // 2018-12-25
À propos, lorsque vous traitez avec le calendrier japonais, écrivez comme ci-dessus.
À partir de Java 8, travailler avec des dates est devenu beaucoup plus facile. Cependant, j'ai également constaté qu'il existe diverses précautions lors de son utilisation. Si vous le recherchez sur le net, vous pouvez voir comment l'utiliser immédiatement, mais vous ne pouvez pas juger si la méthode est vraiment correcte sans une connaissance appropriée. Nous vous recommandons également de consulter la documentation officielle, y compris le contenu présenté cette fois.
Recommended Posts