Java DateFormat unten gegen oben

Einführung

Java DateTimeFormatter verwendet die festen alphabetischen Zeichen mit halber Breite, um zu entscheiden, welche Art von Zeichenfolge verwendet werden soll. Unter ihnen gibt es viele Zeichenketten wie "y" und "Y", die versuchen, verschiedene Dinge nur durch den Unterschied zwischen Groß- und Kleinschreibung auszudrücken. Hier ist eine Zusammenfassung der Unterschiede.

Umgebung

Vielleicht gibt es keinen Unterschied in der Version mit Java, aber ich verwende Java 11. Jshell ist nützlich, um wie dieses Mal Kurzcode zu zeichnen, also versuche ich es auf JShell.

Importieren Sie nach dem Start die Klasse, die Sie verwenden werden.

tasogarei $ jshell
|Willkommen bei JShell--Version 11.0.1
|Geben Sie für eine Übersicht Folgendes ein: /help intro

jshell> import java.time.*

jshell> import java.time.format.DateTimeFormatter

g vs G "g" zeigt Julius Pendelverkehr an und "G" zeigt die Ära an.

jshell> LocalDateTime.now().format(DateTimeFormatter.ofPattern("g"));
$83 ==> "58499"

jshell> LocalDateTime.now().format(DateTimeFormatter.ofPattern("G"));
$84 ==> "ANZEIGE"

Wenn Sie wissen möchten, wie Julius nach Japan pendelt, lesen Sie bitte Wikipedia (ich habe es auch zum ersten Mal gelernt). https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5

m vs M Das ist einfach: m steht für Minuten und M steht für Monate. Wenn Sie jeweils zwei überlappen, wird bei einer Ziffer ein String mit 0-Auffüllung zurückgegeben. Wenn Sie also die gleiche Anzahl von Ziffern haben möchten, schreiben Sie normalerweise zwei. In beiden Fällen beträgt die Anzahl der Stellen, die ausgedrückt werden sollen, bis zu 2 Stellen. Wenn Sie also 3 Stellen schreiben, tritt zur Laufzeit ein Fehler auf.

jshell> LocalDateTime.of(2019,12,12,12,1,1).format(DateTimeFormatter.ofPattern("mmm"));
|Ausnahme Java.lang.IllegalArgumentException: Too many pattern letters: m
|        at DateTimeFormatterBuilder.parseField (DateTimeFormatterBuilder.java:1952)
|        at DateTimeFormatterBuilder.parsePattern (DateTimeFormatterBuilder.java:1734)
|        at DateTimeFormatterBuilder.appendPattern (DateTimeFormatterBuilder.java:1702)
|        at DateTimeFormatter.ofPattern (DateTimeFormatter.java:564)
|        at (#24:1)

Da jedoch "M" situationsabhängig ist, kann es tatsächlich korrekter sein, "L" zu verwenden. Da L eine eigenständige Methode ist, wird immer der gleiche Wert angezeigt. Nur mit diesem Unterschied für "SimpleDateFormat" können Sie beide problemlos verwenden, wenn Sie "DateTimeFormatter" verwenden.

d vs D Dies scheint eine ähnliche Bedeutung zu haben und verhält sich anders.

Zunächst ist es "d", aber es zeigt das monatbasierte Datum in der Beschreibung als "Tag des Monats" an. Es ist das Datum, das wir üblicherweise verwenden.

jshell> LocalDate.of(2019,2,2).format(DateTimeFormatter.ofPattern("dd"));
$3 ==> "02"

Andererseits ist "D" "Tag des Jahres", der das auf dem Jahr basierende Datum anzeigt. Es ist die Anzahl der Tage seit dem 1. Januar, dem Beginn des Jahres.

jshell> LocalDate.of(2019,2,2).format(DateTimeFormatter.ofPattern("DDD"));
$4 ==> "033"

y vs Y Bevor wir uns den Unterschied zwischen den beiden ansehen, schauen wir uns die Codeergebnisse an, um festzustellen, dass sich das Anzeigeformat in Abhängigkeit von der angegebenen Anzahl unterscheidet. Im Allgemeinen denke ich, dass Sie entweder zwei und die letzten zwei oder vier Ziffern angeben und alle anzeigen lassen. Ich glaube nicht, dass es viele Fälle gibt, in denen andere Jahre als 4 Ziffern angezeigt werden. Daher werden wir hier nur 4 Ziffern betrachten.

jshell> LocalDate.of(2019,2,2).format(DateTimeFormatter.ofPattern("y"));
$5 ==> "2019"

jshell> LocalDate.of(2019,2,2).format(DateTimeFormatter.ofPattern("yy"));
$6 ==> "19"

jshell> LocalDate.of(2019,2,2).format(DateTimeFormatter.ofPattern("yyy"));
$7 ==> "2019"

jshell> LocalDate.of(2019,2,2).format(DateTimeFormatter.ofPattern("yyyy"));
$8 ==> "2019"

Da das Großbuchstaben "Y" auch zum Ausdrücken des Jahres verwendet wird, ändert sich die Zahlenspezifikation nicht.

jshell> LocalDate.of(2019,2,2).format(DateTimeFormatter.ofPattern("Y"));
$9 ==> "2019"

jshell> LocalDate.of(2019,2,2).format(DateTimeFormatter.ofPattern("YY"));
$10 ==> "19"

jshell> LocalDate.of(2019,2,2).format(DateTimeFormatter.ofPattern("YYY"));
$11 ==> "2019"

jshell> LocalDate.of(2019,2,2).format(DateTimeFormatter.ofPattern("YYYY"));
$12 ==> "2019"

Und der Unterschied ist, schauen Sie sich zuerst den folgenden Code an.

jshell> LocalDate.of(2018,12,30).format(DateTimeFormatter.ofPattern("YYYY"));
$44 ==> "2019"

jshell> LocalDate.of(2018,12,30).format(DateTimeFormatter.ofPattern("yyyy"));
$45 ==> "2018"

Obwohl ich das gleiche Datum angegeben habe, ist das Jahr um ein Jahr verschoben. Dies ist der Unterschied, da "Y" für die Anzeige des Jahres im Gregorianischen Kalender und "y" für die Anzeige des Jahres der Ära steht, sodass der Unterschied auftritt. Werfen Sie für den Gregorianischen Kalender einen Blick auf JavaDoc, aber es ist eine gute Idee zu bedenken, dass die Möglichkeit besteht, dass die Jahresend- und Neujahrsferien ausfallen. Daher kann es eine Brutstätte für das Einbetten von Fehlern sein, die wahrscheinlich nur durch Testen der Jahresanzeige für einige Tage während der Jahresend- und Neujahrsferien durchrutschen. Es besteht kein Zweifel, dass ich es vor langer Zeit getan hatte und eine sehr schlechte Zeit hatte.

Übrigens zeigt y das Jahr in Bezug auf die Ära an. Wenn die Ära also nicht im westlichen Kalender enthalten ist, entspricht sie möglicherweise nicht dem erwarteten Wert. Standardmäßig ist die Ära der westliche Kalender (ich habe ihn erst bestätigt, nachdem ich das Gebietsschema geändert habe).

jshell> LocalDate.of(2018,12,30).format(DateTimeFormatter.ofPattern("G"));
$46 ==> "ANZEIGE"

Ich denke nicht, dass es ein großes Problem ist, aber um genau zu sein, wird gesagt, dass "u" verwendet wird, um das Jahr so anzuzeigen, wie es ist, also kann die Verwendung von "u" die richtige Antwort sein. Ich denke, es hängt von der Denkweise ab, also kann ich nichts sagen.

jshell> LocalDate.of(2018,12,30).format(DateTimeFormatter.ofPattern("u"));
$47 ==> "2018"

k gegen K und h gegen H.

k und K, h und H zeigen die Zeit an, aber diejenigen, die sie anzeigen, sind unterschiedlich. In der folgenden Tabelle ist zusammengefasst, was jeweils angezeigt wird.

k K h H
1-24 0-11 1-12 0-23

Es gibt einen großen Unterschied, dass die Kleinbuchstaben um 24 Uhr und die Großbuchstaben um 12 Uhr geschrieben werden.

w vs W Sowohl "w" als auch "W" sind ähnliche Ausdrücke für die Woche, haben jedoch unterschiedliche Kriterien. Der Unterschied besteht darin, dass "w" die Anzahl der Runden des Monats für "W" des Jahres anzeigt.

jshell> LocalDate.of(2019,2,2).format(DateTimeFormatter.ofPattern("W"));
$55 ==> "1"

jshell> LocalDate.of(2019,2,2).format(DateTimeFormatter.ofPattern("w"));
$56 ==> "5"

s vs S "s" repräsentiert eine allgemeine Sekunde, während "S" einen "Sekundenbruchteil" repräsentiert.

jshell> LocalDateTime.now().format(DateTimeFormatter.ofPattern("s"));
$57 ==> "24"

jshell> LocalDateTime.now().format(DateTimeFormatter.ofPattern("S"));
$58 ==> "7"

Ich verstehe S nicht wirklich, also habe ich mehr als eins angegeben und mir den Unterschied in der Bedienung angesehen.

jshell> LocalDateTime.of(2019,1,1,0,0,12,10);
$75 ==> 2019-01-01T00:00:12.000000010

jshell> LocalDateTime.of(2019,1,1,0,0,12,10).format(DateTimeFormatter.ofPattern("SSS"));
$76 ==> "000"

jshell> LocalDateTime.of(2019,1,1,0,0,12,10).format(DateTimeFormatter.ofPattern("SSSS"));
$77 ==> "0000"

jshell> LocalDateTime.of(2019,1,1,0,0,12,10).format(DateTimeFormatter.ofPattern("SSSSS"));
$78 ==> "00000"

jshell> LocalDateTime.of(2019,1,1,0,0,12,10).format(DateTimeFormatter.ofPattern("SSSSSS"));
$79 ==> "000000"

jshell> LocalDateTime.of(2019,1,1,0,0,12,10).format(DateTimeFormatter.ofPattern("SSSSSSS"));
$80 ==> "0000000"

jshell> LocalDateTime.of(2019,1,1,0,0,12,10).format(DateTimeFormatter.ofPattern("SSSSSSSS"));
$81 ==> "00000001"

jshell> LocalDateTime.of(2019,1,1,0,0,12,10).format(DateTimeFormatter.ofPattern("SSSSSSSSS"));
$82 ==> "000000010"

Anscheinend scheint es anzuzeigen, wie viele Ziffern weniger als eine Sekunde sind. Es ist ein Pegel, der endgültig unterschieden werden kann, indem 10 Nanosekunden durch Angabe von "von" und Erkennen des Unterschieds im Betrieb angegeben werden.

q vs Q q und Q sind selten gleichbedeutend mit der Häufigkeit in einem Viertel. Ich weiß nicht, warum so viele Buchstaben unterschiedliche Bedeutungen haben, aber sie sind alle gleich.

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("q"));
$87 ==> "4"

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("Q"));
$88 ==> "4"

e vs E "e" zeigt den lokalisierten Tag und "E" zeigt den allgemeinen Tag.

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("E"));
$96 ==> "Feuer"

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("e"));
$97 ==> "3"

e und E haben ein interessantes Verhalten, bei dem sich die Anzeige abhängig von der angegebenen Nummer ändert. Versuchen Sie also, die angegebene Nummer zu ändern.

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("ee"));
$101 ==> "03"

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("eee"));
$102 ==> "Feuer"

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("eeee"));
$103 ==> "Dienstag"

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("eeeee"));
$104 ==> "Feuer"

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("eeeeee"));
|Ausnahme Java.lang.IllegalArgumentException: Too many pattern letters: e
|        at DateTimeFormatterBuilder.parseField (DateTimeFormatterBuilder.java:1903)
|        at DateTimeFormatterBuilder.parsePattern (DateTimeFormatterBuilder.java:1734)
|        at DateTimeFormatterBuilder.appendPattern (DateTimeFormatterBuilder.java:1702)
|        at DateTimeFormatter.ofPattern (DateTimeFormatter.java:564)
|        at (#105:1)
jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("EE"));
$108 ==> "Feuer"

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("EEE"));
$109 ==> "Feuer"

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("EEEE"));
$110 ==> "Dienstag"

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("EEEEE"));
$111 ==> "Feuer"

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("EEEEEE"));
|Ausnahme Java.lang.IllegalArgumentException: Too many pattern letters: E
|        at DateTimeFormatterBuilder.parseField (DateTimeFormatterBuilder.java:1903)
|        at DateTimeFormatterBuilder.parsePattern (DateTimeFormatterBuilder.java:1734)
|        at DateTimeFormatterBuilder.appendPattern (DateTimeFormatterBuilder.java:1702)
|        at DateTimeFormatter.ofPattern (DateTimeFormatter.java:564)
|        at (#112:1)

Übrigens war ich mir nicht sicher, in welchem Fall sich die Anzeige der lokalisierten Tage und der allgemeinen Tage änderte.

Übrigens wird "c" genauso angezeigt wie "e", aber wenn Sie zwei oder mehr angeben, tritt ein Fehler auf. Es scheint, dass der Typ von "c" Zahlen mit Zahlen behandelt und "e" Zeichenfolgen mit Text behandelt.

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("c"));
$113 ==> "3"

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("cc"));
|Ausnahme Java.lang.IllegalArgumentException: Invalid pattern "cc"
|        at DateTimeFormatterBuilder.parseField (DateTimeFormatterBuilder.java:1867)
|        at DateTimeFormatterBuilder.parsePattern (DateTimeFormatterBuilder.java:1734)
|        at DateTimeFormatterBuilder.appendPattern (DateTimeFormatterBuilder.java:1702)
|        at DateTimeFormatter.ofPattern (DateTimeFormatter.java:564)
|        at (#114:1)

Beachten Sie außerdem, dass "e" und "c" nicht in "SimpleDateFormatter" definiert sind und in "DateTimeFormatter" angezeigt werden.

jshell> new SimpleDateFormat("E").format(new Date())
$144 ==> "Wasser"

jshell> new SimpleDateFormat("e").format(new Date())
|Ausnahme Java.lang.IllegalArgumentException: Illegal pattern character 'e'
|        at SimpleDateFormat.compile (SimpleDateFormat.java:845)
|        at SimpleDateFormat.initialize (SimpleDateFormat.java:653)
|        at SimpleDateFormat.<init> (SimpleDateFormat.java:624)
|        at SimpleDateFormat.<init> (SimpleDateFormat.java:599)
|        at (#145:1)

jshell> new SimpleDateFormat("c").format(new Date())
|Ausnahme Java.lang.IllegalArgumentException: Illegal pattern character 'c'
|        at SimpleDateFormat.compile (SimpleDateFormat.java:845)
|        at SimpleDateFormat.initialize (SimpleDateFormat.java:653)
|        at SimpleDateFormat.<init> (SimpleDateFormat.java:624)
|        at SimpleDateFormat.<init> (SimpleDateFormat.java:599)
|        at (#146:1)

a vs A "a" steht für den Morgen und den Nachmittag des Tages und "A" für die Anzahl der ms, die am Tag vergangen sind.

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("a"));
$147 ==> "a.m."

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("A"));
$148 ==> "12000"

n VS N "n" repräsentiert den Nanosekunden-Teil der Zeit und "N" repräsentiert, wie viele ns am Tag vergangen sind.

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("n"));
$149 ==> "10"

jshell> LocalDateTime.of(2019,10,1,0,0,12,10).format(DateTimeFormatter.ofPattern("N"));
$150 ==> "12000000010"

v vs V "v" steht für einen generischen Zeitzonennamen und "V" für eine Zeitzonen-ID. Wenn für "V" nur eines vorhanden ist, tritt ein Fehler auf, sodass Sie zwei als "VV" angeben müssen.

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("v"));
$159 ==> "GMT+09:00"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("VV"));
$160 ==> "Asia/Tokyo"

Da diese die Zeitzone ausdrücken möchten, tritt im "LocalDate" -System ein Fehler auf, der nicht das Konzept der Zeitzone enthält. Vorsicht ist geboten.

jshell> LocalDateTime.now().format(DateTimeFormatter.ofPattern("VV"));
|Ausnahme Java.time.DateTimeException: Unable to extract ZoneId from temporal 2019-01-16T17:33:36.488440
|        at DateTimePrintContext.getValue (DateTimePrintContext.java:289)
|        at DateTimeFormatterBuilder$ZoneIdPrinterParser.format (DateTimeFormatterBuilder.java:4170)
|        at DateTimeFormatterBuilder$CompositePrinterParser.format (DateTimeFormatterBuilder.java:2335)
|        at DateTimeFormatter.formatTo (DateTimeFormatter.java:1843)
|        at DateTimeFormatter.format (DateTimeFormatter.java:1817)
|        at LocalDateTime.format (LocalDateTime.java:1752)
|        at (#161:1)

jshell> LocalDateTime.now().format(DateTimeFormatter.ofPattern("v"));
|Ausnahme Java.time.DateTimeException: Unable to extract ZoneId from temporal 2019-01-16T17:33:39.394345
|        at DateTimePrintContext.getValue (DateTimePrintContext.java:289)
|        at DateTimeFormatterBuilder$ZoneTextPrinterParser.format (DateTimeFormatterBuilder.java:4066)
|        at DateTimeFormatterBuilder$CompositePrinterParser.format (DateTimeFormatterBuilder.java:2335)
|        at DateTimeFormatter.formatTo (DateTimeFormatter.java:1843)
|        at DateTimeFormatter.format (DateTimeFormatter.java:1817)
|        at LocalDateTime.format (LocalDateTime.java:1752)
|        at (#162:1)

Übrigens verursacht JapaneseDate, das das Datum in Japan anzeigt, ebenfalls einen Fehler.

jshell> import java.time.chrono.*

jshell> JapaneseDate.now().format(DateTimeFormatter.ofPattern("v"));
|Ausnahme Java.time.DateTimeException: Unable to extract ZoneId from temporal Japanese Heisei 31-01-16
|        at DateTimePrintContext.getValue (DateTimePrintContext.java:289)
|        at DateTimeFormatterBuilder$ZoneTextPrinterParser.format (DateTimeFormatterBuilder.java:4066)
|        at DateTimeFormatterBuilder$CompositePrinterParser.format (DateTimeFormatterBuilder.java:2335)
|        at DateTimeFormatter.formatTo (DateTimeFormatter.java:1843)
|        at DateTimeFormatter.format (DateTimeFormatter.java:1817)
|        at ChronoLocalDate.format (ChronoLocalDate.java:642)
|        at (#164:1)

jshell> JapaneseDate.now().format(DateTimeFormatter.ofPattern("VV"));
|Ausnahme Java.time.DateTimeException: Unable to extract ZoneId from temporal Japanese Heisei 31-01-16
|        at DateTimePrintContext.getValue (DateTimePrintContext.java:289)
|        at DateTimeFormatterBuilder$ZoneIdPrinterParser.format (DateTimeFormatterBuilder.java:4170)
|        at DateTimeFormatterBuilder$CompositePrinterParser.format (DateTimeFormatterBuilder.java:2335)
|        at DateTimeFormatter.formatTo (DateTimeFormatter.java:1843)
|        at DateTimeFormatter.format (DateTimeFormatter.java:1817)
|        at ChronoLocalDate.format (ChronoLocalDate.java:642)
|        at (#165:1)

z vs Z "z" steht für den Namen der Zeitzone und "Z" für den Zonenversatz. Ich dachte, dass es eine ernste Situation verursachen würde, wenn ich anfangen würde, über Dinge zu sprechen, die im Allgemeinen nicht miteinander verbunden sind, deshalb werde ich sie hier weglassen.

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("z"));
$166 ==> "JST"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("Z"));
$167 ==> "+0900"

Die Anzeige von z und Z ändert sich auch abhängig von der angegebenen Nummer, daher möchte ich sie angeben.

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("z"));
$174 ==> "JST"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("zz"));
$175 ==> "JST"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("zzz"));
$176 ==> "JST"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("zzzz"));
$177 ==> "Japanische Standardzeit"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("zzzzz"));
|Ausnahme Java.lang.IllegalArgumentException: Too many pattern letters: z
|        at DateTimeFormatterBuilder.parsePattern (DateTimeFormatterBuilder.java:1737)
|        at DateTimeFormatterBuilder.appendPattern (DateTimeFormatterBuilder.java:1702)
|        at DateTimeFormatter.ofPattern (DateTimeFormatter.java:564)
|        at (#178:1)
jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("Z"));
$180 ==> "+0900"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("ZZ"));
$181 ==> "+0900"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("ZZZ"));
$182 ==> "+0900"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("ZZZZ"));
$183 ==> "GMT+09:00"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("ZZZZZ"));
$184 ==> "+09:00"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("ZZZZZZ"));
|Ausnahme Java.lang.IllegalArgumentException: Too many pattern letters: Z
|        at DateTimeFormatterBuilder.parsePattern (DateTimeFormatterBuilder.java:1764)
|        at DateTimeFormatterBuilder.appendPattern (DateTimeFormatterBuilder.java:1702)
|        at DateTimeFormatter.ofPattern (DateTimeFormatter.java:564)
|        at (#185:1)

Beachten Sie, dass sich z und Z anders verhalten als SimpleDateFormatter.

jshell> new SimpleDateFormat("Z").format(new Date());
$219 ==> "+0900"

jshell> new SimpleDateFormat("ZZ").format(new Date());
$220 ==> "+0900"

jshell> new SimpleDateFormat("ZZZ").format(new Date());
$221 ==> "+0900"

jshell> new SimpleDateFormat("ZZZZ").format(new Date());
$222 ==> "+0900"

jshell> new SimpleDateFormat("ZZZZZ").format(new Date());
$223 ==> "+0900"

jshell> new SimpleDateFormat("ZZZZZZ").format(new Date());
$224 ==> "+0900"
jshell> new SimpleDateFormat("z").format(new Date());
$210 ==> "JST"

jshell> new SimpleDateFormat("zz").format(new Date());
$211 ==> "JST"

jshell> new SimpleDateFormat("zzz").format(new Date());
$212 ==> "JST"

jshell> new SimpleDateFormat("zzzz").format(new Date());
$213 ==> "Japanische Standardzeit"

jshell> new SimpleDateFormat("zzzzz").format(new Date());
$214 ==> "Japanische Standardzeit"

jshell> new SimpleDateFormat("zzzzzz").format(new Date());
$215 ==> "Japanische Standardzeit"

jshell> new SimpleDateFormat("zzzzzzz").format(new Date());
$216 ==> "Japanische Standardzeit"

jshell> new SimpleDateFormat("zzzzzzzz").format(new Date());
$217 ==> "Japanische Standardzeit"

Ich habe übrigens versucht, die Nummer anzugeben, aber es ist kein Fehler aufgetreten.

x vs X Sowohl "x" als auch "X" stellen einen Zonenversatz dar, der sich bis auf UTC gleich zu verhalten scheint. Der einzige Unterschied zu "Z" besteht darin, dass sich die Anzeige ändert, wenn 1 und 4 angegeben werden.

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("x"));
$186 ==> "+09"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("X"));
$187 ==> "+09
jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("x"));
$188 ==> "+09"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("xx"));
$189 ==> "+0900"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("xxx"));
$190 ==> "+09:00"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("xxxx"));
$191 ==> "+0900"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("xxxxx"));
$192 ==> "+09:00"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("xxxxxx"));
|Ausnahme Java.lang.IllegalArgumentException: Too many pattern letters: x
|        at DateTimeFormatterBuilder.parsePattern (DateTimeFormatterBuilder.java:1781)
|        at DateTimeFormatterBuilder.appendPattern (DateTimeFormatterBuilder.java:1702)
|        at DateTimeFormatter.ofPattern (DateTimeFormatter.java:564)
|        at (#193:1)
jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("X"));
$194 ==> "+09"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("XX"));
$195 ==> "+0900"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("XXX"));
$196 ==> "+09:00"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("XXXX"));
$197 ==> "+0900"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("XXXXX"));
$198 ==> "+09:00"

jshell> ZonedDateTime.now().format(DateTimeFormatter.ofPattern("XXXXXX"));
|Ausnahme Java.lang.IllegalArgumentException: Too many pattern letters: X
|        at DateTimeFormatterBuilder.parsePattern (DateTimeFormatterBuilder.java:1776)
|        at DateTimeFormatterBuilder.appendPattern (DateTimeFormatterBuilder.java:1702)
|        at DateTimeFormatter.ofPattern (DateTimeFormatter.java:564)
|        at (#199:1)

Übrigens existiert "x" nicht in "SimpleDateFormatter", sondern nur in "DateTimeFormatter".

jshell> new SimpleDateFormat("x").format(new Date());
|Ausnahme Java.lang.IllegalArgumentException: Illegal pattern character 'x'
|        at SimpleDateFormat.compile (SimpleDateFormat.java:845)
|        at SimpleDateFormat.initialize (SimpleDateFormat.java:653)
|        at SimpleDateFormat.<init> (SimpleDateFormat.java:624)
|        at SimpleDateFormat.<init> (SimpleDateFormat.java:599)
|        at (#205:1)

Beachten Sie, dass das Verhalten von "X" ebenfalls unterschiedlich ist.

jshell> new SimpleDateFormat("X").format(new Date());
$206 ==> "+09"

jshell> new SimpleDateFormat("XX").format(new Date());
$207 ==> "+0900"

jshell> new SimpleDateFormat("XXX").format(new Date());
$208 ==> "+09:00"

jshell> new SimpleDateFormat("XXXX").format(new Date());
|Ausnahme Java.lang.IllegalArgumentException: invalid ISO 8601 format: length=4
|        at SimpleDateFormat.encode (SimpleDateFormat.java:884)
|        at SimpleDateFormat.compile (SimpleDateFormat.java:865)
|        at SimpleDateFormat.initialize (SimpleDateFormat.java:653)
|        at SimpleDateFormat.<init> (SimpleDateFormat.java:624)
|        at SimpleDateFormat.<init> (SimpleDateFormat.java:599)
|        at (#209:1)

Sie werden den Unterschied nicht bemerken, der nur in UTC auftritt, da er normalerweise die Zeit in JST ausgibt, aber ich denke, Sie sollten nur daran denken, vorsichtig mit UTC umzugehen. Ich habe es endlich verstanden, indem ich mir die Implementierung angesehen habe.

jshell> ZonedDateTime.of(2019,1,1,1,1,1,1,ZoneId.of(ZoneOffset.UTC.toString())).format(DateTimeFormatter.ofPattern("X"));
$228 ==> "Z"

jshell> ZonedDateTime.of(2019,1,1,1,1,1,1,ZoneId.of(ZoneOffset.UTC.toString())).format(DateTimeFormatter.ofPattern("x"));
$229 ==> "+00"

schließlich

Es stellte sich als beängstigender heraus als ich erwartet hatte, da es viele Punkte gibt, an denen sich das Verhalten von "SimpleDateFormatter" unterscheidet und die Zeitzone verdächtig ist. Um ehrlich zu sein, habe ich es nicht so oft benutzt, daher weiß ich nicht, was im Moment richtig ist, aber wenn ich Zeit habe, würde ich gerne die Implementierung auf der Java-Seite sehen.

Recommended Posts

Java DateFormat unten gegen oben
Java - StringBuilder vs StringBuffer
[Java] Konvertieren Sie Zeichenfolgen in Groß- / Kleinschreibung (AOJ⑨ - Swap in Groß- / Kleinschreibung)
Kana-Konvertierung in Groß- / Kleinbuchstaben in Java, trüber / halbtrübe Punkt gelöscht
Java Spring-Umgebung in vs Code
Erstellen Sie Java mit Mac vs Code
Java-Entwicklungsumgebung (Mac, VS Code)