Lorsque vous utilisez le constructeur de la classe Date de Java, la date avance de 1900.

Cela me rappelle vraiment maintenant, mais j'y suis accro ...

introduction

Lorsque j'écrivais un programme pour formater une date en une chaîne, j'ai rencontré un phénomène selon lequel le nombre d'années avançait vers 1900 pour une raison quelconque. En premier lieu, le constructeur qui prend les "year, month, day" de la classe Date est obsolète, donc c'est certainement une histoire que vous n'avez pas à l'utiliser. Cependant, c'est un exemple d'échec qui se produit lorsque vous l'utilisez négligemment sans le savoir.

phénomène

DateTest.java


import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTest {
  public static void main(String[] args) {
    int year = 2018;
    int month = 5;
    int dayOfMonth = 6;
    Date todayDate = new Date(year, month, dayOfMonth);
    DateFormat dateFormat = SimpleDateFormat.getDateInstance();
    System.out.println(dateFormat.format(todayDate));
  }
}

Comme dans cet exemple, si vous créez une instance Date basée sur la date donnée par le type ʻint et créez unFormat avec DateFormat`,

3918/06/06

Cette année, c'est 2018, mais c'est 3918. Il a exactement 1900 ans.

Raison

Ceci est une spécification de la classe java.util.Date. Également écrit en Date (Java Platform SE 8) Cependant, l'implémentation est telle que la valeur de «year» reçue par ce constructeur est l'année de l'année moins 1900.

En premier lieu ...

Comme cela est bien connu de ceux qui le connaissent, le constructeur qui prend la date de java.util.Date est obsolète de JDK1.1 (il apparaîtra lorsque vous recherchez Date, donc juste Je vais probablement l'utiliser). Au lieu de cela, il est préférable d'instancier avec java.util.Calendar puis d'obtenir une instance Date avec Calendar # getDate.

DateTest.java


import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class DateTest {
  public static void main(String[] args) {
    int year = 2018;
    int month = 5;
    int dayOfMonth = 6;
    Calendar todayDate = Calendar.getInstance();
    todayDate.set(year, month, dayOfMonth);
    DateFormat dateFormat = SimpleDateFormat.getDateInstance();
    System.out.println(dateFormat.format(todayDate.getTime()));
  }
}

2018/07/06

La date est maintenant sortie normalement.

Recommended Posts

Lorsque vous utilisez le constructeur de la classe Date de Java, la date avance de 1900.
Sortie du jour en utilisant la classe Ruby's Date
Utilisation de la classe Date
[Kotlin] Récupère le nom de l'argument du constructeur par réflexion
Lorsque le mois de la date est acquis, le quart de janvier
Limiter le nombre de threads à l'aide du service d'exécution de Java
Comment obtenir le nom de classe de l'argument de LoggerFactory.getLogger lors de l'utilisation de SLF4J en Java
[Rails] Utilisez la zone déroulante pour trier la liste des articles par date ou par nombre de likes.
Être un peu bloqué le dernier jour du mois en utilisant la classe Calendar de Java
[Enum] Utilisez des rails enum pour améliorer la lisibilité des données
[Rails] Enregistrez-vous par attribut du même modèle en utilisant Devise
Exemple d'utilisation d'une classe abstraite
[Rails] Comment convertir l'URI de l'image envoyée par http en https lors de l'utilisation de l'API Twitter
Je veux juger de la nécessité de tester en comparant les différences des fichiers de classe lors de la refactorisation de Java.
Changer la version de java installée par SDKMAN lors du déplacement de répertoires
Le concept de conception de l'API de date et d'heure de Java est intéressant
Un moyen simple de créer une classe de mappage lors de l'utilisation de l'API
Lors de l'utilisation de JDBC, les paramètres NLS sont affectés par les paramètres régionaux Java.
Obtenir la date sans utiliser la classe Calendar
Diverses méthodes de la classe String
Erreur lors de la finalisation du membre de la classe Entity utilisé dans SpringWebFlux
[Java] Comment accéder au début d'une chaîne spécifique à l'aide de la classe String
À partir de Java9, les constructeurs de classe correspondant aux types primitifs sont marqués comme obsolètes.
Afficher le calendrier et le jour japonais en utilisant la classe standard java8
Lorsque le nom de la classe du bean est dupliqué
Essayez d'utiliser || au lieu de l'opérateur ternaire
Lire un fichier à l'aide de la classe Scanner de Java
Le contenu des données enregistrées par CarrierWave.
Trier par plusieurs champs dans la classe
[Java] Obtenez la date avec la classe LocalDateTime
Nommer et appeler explicitement des méthodes de classe parent dans Ruby
Obtenez le nom de classe et le nom de méthode du contrôleur exécuté par le HandlerInterceptor de Spring Boot
Faites attention à la vérification des limites de la valeur d'entrée lors de l'utilisation du type float
[Java] Calculer le jour à partir de la date (ne pas utiliser la classe Calendar)