Die Beziehung zwischen strenger Java-Datumsprüfung und Sommerzeit

Strenge Überprüfung des Datums

DateFormat # setLenient (boolean) ist eine Einstellung für ** Prüfung auf lose Daten **. Es wird in SimpleDateFormat usw. verwendet. Der Standardwert ist "true", was nicht streng überprüft wird. Wenn Sie eine strenge Prüfung wünschen, setzen Sie "false". [^ 1] [^ 1]: Es ist das Gegenteil von Ungenauigkeit (entwerfen Sie den Booleschen Wert nicht so, dass er umgekehrt wird, je nachdem, wie Sie darüber denken). Nicht locker. Nicht locker. Gachi. Unter Java 8 können Sie übrigens Enumeration ResolverStyle mit DateTimeFormatter verwenden. Ich bin.

Referenz: JDK DateFormat # setLenient (boolean) öffnen, Oracle Java DateFormat # setLenient (boolean))

Wenn Sie keine strenge Prüfung durchführen, wird dies als 3/1 interpretiert, auch wenn es 2/29 ist, wenn es kein gutes Jahr ist.

Sommerzeit (Sommerzeit)

Es ist in Japan nicht sehr bekannt, aber es wird gesagt, dass es nur im Sommer eine Stunde früher sein wird (https://ja.wikipedia.org/wiki/%E5%A4%8F%E6%99%82%E9%96%93 ) [^ 2]. In der östlichen Zeit (EST / EDT) in New York [^ 3] ist die Sommerzeit von 2:00 Uhr am zweiten Sonntag im März bis 2:00 Uhr am ersten Sonntag im November, und dieser Zeitraum wird um eine Stunde vorverlegt. [^ 2]: Sommerzeit, Sommerzeit, Sommerzeit, Sonnenzeit. Es scheint, dass es früher in Japan war. Je nach Region können es 30 Minuten statt 1 Stunde sein. [^ 3]: Bis 2006 war es von 2:00 Uhr am ersten Sonntag im April bis 2:00 Uhr am letzten Sonntag im Oktober. Es kommt auf das Gesetz an.

2020/03/08 02:00:00 wird zu einem Fehler

private static void datechange(String date) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    sdf.setLenient(false); //Nicht locker
    sdf.setTimeZone(TimeZone.getTimeZone("US/Eastern")); // EDT
    try {
        Date pdate = sdf.parse(date);
        System.out.println(sdf.format(pdate));
    } catch (Exception e) {
        e.printStackTrace();
    }
}
//Beginn der Sommerzeit(1 Stunde vorrücken)
datechange("2020/03/08 01:59:59"); // OK
datechange("2020/03/08 02:00:00"); // NG: ParseException
datechange("2020/03/08 02:00:01"); // NG: ParseException
datechange("2020/03/08 02:59:59"); // NG: ParseException
datechange("2020/03/08 03:00:00"); // OK

//Ende der Sommerzeit(1 Stunde zurück)
datechange("2020/11/01 01:59:59"); // OK
datechange("2020/11/01 02:00:00"); // OK
datechange("2020/11/01 02:00:01"); // OK
datechange("2020/11/01 02:59:59"); // OK
datechange("2020/11/01 03:00:00"); // OK
java.text.ParseException: Unparseable date: "2020/03/08 02:00:00"
	at java.text.DateFormat.parse(DateFormat.java:357)

Wenn Sie "setLenient (false)" streng prüfen und die Zeitzone "EDT" ist, führt das Parsen von "2020/03/08 02: 00: 00" zu "java.text.ParseException" ..

Auch wenn es sich nicht um "EDT" handelt, tritt ein Fehler auf, wenn in der Zeitzone, die die Sommerzeit berücksichtigt, ** "1 Stunde zur Sommerzeit übersprungen" ** angegeben ist.

Mit anderen Worten, ** EDT hat nicht 2020/03/08 02: 00: 00 **.

Bei der Rückkehr für 1 Stunde tritt kein Fehler auf. Es unterscheidet sich ein wenig von dieser Geschichte, aber wenn Sie das Datum als eindeutigen Schlüssel festlegen, wenn Sie eine Stunde zurückgehen, ist dies eine eindeutige Verletzung der Einschränkungen. Die Sortierung ist nicht wie erwartet. [^ 4] [^ 4]: Hoffen wir, dass es kein System gibt, das die Ortszeit in der Datenbank als Zeichenfolge registriert. (Normalerweise handelt es sich um einen Datumstyp, der nicht von der Zeitzone beeinflusst wird, oder selbst wenn es sich um eine Zeichenfolge handelt, handelt es sich um UTC oder um eine numerische Epochensekunde.)

Ursache

Da wir eine Zeit angegeben haben, die nicht existiert, liegt das Problem nicht bei den obigen Spezifikationen, sondern bei den Originaldaten und dem Erfassungsprozess. In diesem Beispiel war die Ursache, dass die Originaldaten "JST" anstelle von "EDT" waren. (Zeitzoneninkonsistenz zwischen Originaldaten [JST] und Importprozess [EDT])

Recommended Posts

Die Beziehung zwischen strenger Java-Datumsprüfung und Sommerzeit
Was ist die LocalDateTime-Klasse? [Java-Anfänger] -Datum und Zeitklasse-
[Java] Verwenden Sie ResolverStyle.LENIENT, um Datum und Uhrzeit gut zu handhaben
[Java] Beziehung zwischen H2DB und JDBC
[MySQL] [Java] Datum und Uhrzeit empfangen
Informationen zur Beziehung zwischen dem Java String Equality Operator (==) und der Initialisierung. Anfänger
Beziehung zwischen Kotlin- und Java-Zugriffsmodifikatoren
[Java] So stellen Sie die Datums- und Uhrzeit auf 00:00:00 ein
Interpretieren Sie die Beziehung zwischen Java-Methoden und Argumenten in biochemischen Formeln
Datum (und Uhrzeit
[Java] Verstehe den Unterschied zwischen List und Set
Formatieren Sie das von created_at angegebene Datum und die Uhrzeit
Fassen Sie die Unterschiede zwischen C # - und Java-Schrift zusammen
Das Datum und die Uhrzeit von java8 wurden aktualisiert
[Java] Abrufen und Anzeigen des Datums 10 Tage später mithilfe der von Java 8 hinzugefügten Zeit-API.
Analysieren Sie die Datums- und Zeitzeichenfolge, die von der asctime-Funktion der C-Sprache in Java formatiert wurde
Informationen zur Beziehung zwischen HTTP-Methoden, Aktionen und CRUD
[JAVA] Was ist der Unterschied zwischen Schnittstelle und Zusammenfassung? ?? ??
Zum ersten Mal lernen Java # 3 Ausdrücke und Operatoren
Überprüfung der Beziehung zwischen dem Docker-Image und dem Container
Behandeln Sie die Java 8-Datums- und Uhrzeit-API mit Thymeleaf mit Spring Boot
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
Stellen Sie Datum und Uhrzeit aus der Zeichenfolge mit POI ein
Beispielcode zum Parsen von Datum und Uhrzeit mit Java SimpleDateFormat
[Java] Überprüfen Sie den Unterschied zwischen orElse und orElseGet mit IntStream
Denken Sie über die Unterschiede zwischen Funktionen und Methoden nach (in Java)
Beziehung zwischen Controller und Ansicht
Beziehung zwischen Paket und Klasse
Überprüfen Sie das aktuelle Datum und die Uhrzeit beim Analysieren mit Javas SimpleDateFormat
Rufen Sie das aktuelle Datum und die aktuelle Uhrzeit ab, indem Sie die Zeitzone in Thymeleaf angeben
[Java] Einführungsstruktur Klassendefinition Beziehung zwischen Klasse und Instanz Methodendefinitionsformat
Das Designkonzept der Datums- und Uhrzeit-API von Java ist interessant
[Java] Was ist der Unterschied zwischen Form, Entität und dto? [Bohne]
Unterschiede zwischen "Anfänger" Java und Kotlin
[Java] Unterschied zwischen Hashmap und HashTable
Java-Veröffentlichungsdatum und EOL-Zusammenfassung
[JAVA] Unterschied zwischen Abstract und Interface
[Java] Unterschied zwischen Array und ArrayList
Unterschiede zwischen Java und .NET Framework
[Java] Unterschied zwischen Closeable und AutoCloseable
[Java] Unterschied zwischen StringBuffer und StringBuilder
[Java] Unterschied zwischen Länge, Länge () und Größe ()
Ein Hinweis zu den Unterschieden zwischen Schnittstellen und abstrakten Klassen in Java
Dies und das der Implementierung der zeitlichen Beurteilung von Daten in Java
Organisieren Sie die Beziehung zwischen SLF4J, Logback und Log4J zusammen mit ihrem Verhalten
Ich habe versucht, die Grammatik von R und Java zu übersetzen [Von Zeit zu Zeit aktualisiert]
Verstehen Sie den Unterschied zwischen int und Integer und BigInteger in Java und float und double
Java-Unit-Test Beurteilung am selben Tag ArDate, Datum, Kalender, lange ignorieren die Zeit und beurteilen, ob sie am selben Tag sind
Java Unit Test Library-Bestimmen Sie, ob Arteriendatum, Kalender, lang das aktuelle Datum und die aktuelle Uhrzeit ist (geben Sie die Toleranz in Minuten an).