Traitement de la date en Java (LocalDate: Initialization)

Traitement des dates

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.

Initialisation de la date

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.

Initialiser avec la date actuelle

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.

Initialiser en spécifiant une date

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.

Initialiser la date à partir des lettres

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.

[Problème 1] Gestion des dates exactes

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.

[Problème 2] Format de date

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.

Résumé

À 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

Traitement de la date en Java (LocalDate: Initialization)
Manipulation de la date dans Java 8
Traitement parallèle mesuré avec Java
Afficher la date actuelle en Java
Traitement de la date
A propos du traitement de la copie de fichiers en Java
Comment implémenter le calcul de la date en Java
Étude de Java 8 (API de date dans le package java.time)
Date de sortie en Java au format étendu ISO 8601
Comment obtenir la date avec Java
Partition en Java
Changements dans Java 11
Janken à Java
Traitement des threads Java
Traitement des chaînes Java
[Java] Traitement multi-thread
Taux circonférentiel à Java
[Java] Traitement de flux
FizzBuzz en Java
traitement itératif java
Traitement parallèle et parallèle dans divers langages (édition Java)
Présentation de NLP4J- [000] Natural Language Processing Index en Java
Lire JSON en Java
Implémentation de l'interpréteur par Java
Faites un blackjack avec Java
[Android / Java] Transition d'écran et traitement de retour par fragments
Application Janken en Java
Programmation par contraintes en Java
Mettez java8 dans centos7
NVL-ish guy en Java
Joindre des tableaux en Java
"Hello World" en Java
Interface appelable en Java
[Java] Opérations de date / heure
Commentaires dans la source Java
Fonctions Azure en Java
Formater XML en Java
Simple htmlspecialchars en Java
[Java Silver] À propos de l'initialisation
Manipulation de base de la date Java
Implémentation Boyer-Moore en Java
Hello World en Java
Utiliser OpenCV avec Java
Mémorandum WebApi avec Java
Détermination de type en Java
Exécuter des commandes en Java (ping)
Divers threads en java
Implémentation du tri de tas (en java)
API Zabbix en Java
Art ASCII à Java
Comparer des listes en Java
POST JSON en Java
Utiliser MouseListener avec le traitement
Exprimer l'échec en Java
Traitement des appels du constructeur JAVA
Créer JSON en Java
Nouveautés de Java 8
Appeler un programme écrit en Swift depuis Processing (Java)
Java aléatoire, divers traitements
Utiliser PreparedStatement en Java