Bei Verwendung des Konstruktors der Date-Klasse von Java wird das Datum um 1900 vorverlegt.

Ich werde jetzt wirklich daran erinnert, aber ich bin süchtig danach ...

Einführung

Als ich ein Programm schrieb, um ein Datum in eine Zeichenfolge zu formatieren, stieß ich auf ein Phänomen, bei dem die Anzahl der Jahre aus irgendeinem Grund um 1900 anstieg. Erstens ist der Konstruktor, der das "Jahr, den Monat, den Tag" der "Date" -Klasse verwendet, veraltet, sodass es sicherlich eine Geschichte ist, die Sie nicht verwenden müssen. Dies ist jedoch ein Beispiel für einen Fehler, der auftritt, wenn Sie ihn unachtsam verwenden, ohne es zu wissen.

Phänomen

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

Wenn Sie wie in diesem Beispiel eine "Date" -Instanz basierend auf dem vom Typ "int" angegebenen Datum erstellen und mit "DateFormat" ein "Format" erstellen,

3918/06/06

Dieses Jahr ist 2018, aber es ist 3918. Es ist genau 1900 Jahre alt.

Grund

Dies ist eine Spezifikation der Klasse "java.util.Date". Auch geschrieben in Datum (Java Platform SE 8) Die Implementierung ist jedoch so, dass der Wert von "Jahr", den dieser Konstruktor erhält, das Jahr des Jahres minus 1900 ist.

An erster Stelle ...

Wie denjenigen bekannt ist, die damit vertraut sind, ist der Konstruktor, der das Datum "java.util.Date" verwendet, in JDK1.1 veraltet (er wird angezeigt, wenn Sie nach "Datum" suchen, daher ist dies nur eine Selbstverständlichkeit. Ich werde es wahrscheinlich benutzen). Stattdessen sollten Sie es mit java.util.Calendar instanziieren und dann mit Calendar # getDate eine Date-Instanz abrufen.

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

Das Datum wird jetzt normal ausgegeben.

Recommended Posts

Bei Verwendung des Konstruktors der Date-Klasse von Java wird das Datum um 1900 vorverlegt.
Ausgabe des Tages mit der Ruby's Date-Klasse
Verwendung der Datumsklasse
[Kotlin] Ermittelt den Argumentnamen des Konstruktors durch Reflektion
Wenn der Monat des Datums erfasst wird, verschiebt sich der Januar
Begrenzen Sie die Anzahl der Threads mithilfe des Java Executor Service
So erhalten Sie den Klassennamen des Arguments von LoggerFactory.getLogger, wenn Sie SLF4J in Java verwenden
[Rails] Verwenden Sie das Pulldown-Feld, um die Post-Liste nach Datum oder Anzahl der Likes zu sortieren.
Mit der Kalenderklasse von Java bleibt man am letzten Tag des Monats ein wenig hängen
[Enum] Verwenden Sie Rails Enum, um die Lesbarkeit von Daten zu verbessern
[Rails] Registrieren Sie sich mit Devise nach Attributen desselben Modells
Beispiel für die Verwendung einer abstrakten Klasse
[Rails] So konvertieren Sie den URI des von http gesendeten Bildes in https, wenn Sie die Twitter-API verwenden
Ich möchte die Notwendigkeit des Testens beurteilen, indem ich die Unterschiede der Klassendateien beim Refactoring von Java vergleiche.
Wechseln Sie die von SDKMAN installierte Java-Version, wenn Sie Verzeichnisse verschieben
Das Designkonzept der Datums- und Uhrzeit-API von Java ist interessant
Einfache Möglichkeit zum Erstellen einer Zuordnungsklasse bei Verwendung der API
Bei Verwendung von JDBC werden NLS-Parameter vom Java-Gebietsschema beeinflusst.
Abrufen des Datums ohne Verwendung der Kalenderklasse
Verschiedene Methoden der String-Klasse
Fehler, wenn das in SpringWebFlux verwendete Mitglied der Entity-Klasse endgültig ist
[Java] Wie man mit der String-Klasse an die Spitze eines bestimmten Strings kommt
Ab Java9 werden Klassenkonstruktoren, die primitiven Typen entsprechen, als veraltet markiert.
Zeigen Sie den japanischen Kalender und Tag mit der Java8-Standardklasse an
Wenn der Bean-Klassenname dupliziert wird
Versuchen Sie, || anstelle des ternären Operators zu verwenden
Lesen einer Datei mit der Scannerklasse von Java
Der Inhalt der von CarrierWave gespeicherten Daten.
Nach mehreren Feldern in der Klasse sortieren
[Java] Ermitteln Sie das Datum mit der LocalDateTime-Klasse
Benennen und rufen Sie in Ruby übergeordnete Klassenmethoden explizit auf
Ruft den Klassennamen und den Methodennamen des Controllers ab, der vom HandlerInterceptor von Spring Boot ausgeführt wird
Achten Sie bei Verwendung des Float-Typs auf die Grenzprüfung des Eingabewerts
[Java] Tag ab Datum berechnen (Kalenderklasse nicht verwenden)