Java-Datumsformat - einschließlich zusätzlicher Zeichen

87

Gibt es eine Entsprechung zur Formatierung im PHP-Date () -Stil in Java? Ich meine, in PHP kann ich Backslash-Escape-Zeichen verwenden, um sie buchstäblich behandeln zu lassen. Dh yyyy \ y \ e \ a \ r würde 2010 Jahre . Ich habe in Java nichts Ähnliches gefunden, alle Beispiele befassen sich nur mit integrierten Datumsformaten.

Insbesondere beschäftige ich mich mit JCalendar-Datumsauswahl und deren dateFormatString- Eigenschaft.

Ich brauche es, weil es in meinem Gebietsschema erforderlich ist, alle möglichen zusätzlichen Dinge im Datumsformat zu schreiben, wie z. B. d. (für Tag) nach Tagen Teil, m. (seit Jahren) nach Jahren Teil und so weiter. Im schlimmsten Fall könnte ich String Replace oder Regexp verwenden, aber vielleicht gibt es einen einfacheren Weg? Danke im Voraus!

Sejanus
quelle
1
Für jeden, der dies 2019 oder später liest, ist die SimpleDateFormatin einigen Antworten verwendete Klasse notorisch mühsam und längst veraltet. Vermeide es. Verwenden Sie stattdessen die kurze Antwort von Mark Jeronimus , die die Verwendung von java.time, der modernen Java-API für Datum und Uhrzeit, demonstriert .
Ole VV

Antworten:

164

Sicher, mit dem SimpleDateFormat können Sie Literalzeichenfolgen einschließen:

Innerhalb von Datums- und Zeitmusterzeichenfolgen werden nicht zitierte Buchstaben von 'A' bis 'Z' und von 'a' bis 'z' als Musterbuchstaben interpretiert, die die Komponenten einer Datums- oder Zeitzeichenfolge darstellen. Text kann in einfache Anführungszeichen (') gesetzt werden, um Interpretationen zu vermeiden. "''" steht für ein einfaches Anführungszeichen. Alle anderen Zeichen werden nicht interpretiert. Sie werden beim Formatieren einfach in die Ausgabezeichenfolge kopiert oder beim Parsen mit der Eingabezeichenfolge abgeglichen.

 "hh 'o''clock' a, zzzz"    12 o'clock PM, Pacific Daylight Time
Thilo
quelle
Super, genau das brauche ich. Überraschenderweise habe ich in keinem der zahlreichen Beispiele, die ich im Web durchsucht habe, so etwas Einfaches gefunden :) Vielen Dank!
Sejanus
1
Wie entkomme ich einem Anführungszeichen? Ich versuche etwas mit dem Format mm 'zu machen. Zeigt zum Beispiel 46 Minuten wie 46 'an.
Sotti
3
@ Sotti : 46''. Der erste, der dem zweiten entkommt.
Thilo
1
Zu Ihrer Information, die furchtbar mühsam Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher.
Basil Bourque
24

Der Vollständigkeit halber DateTimeFormatterunterstützt Java 8 auch Folgendes:

DateTimeFormatter.ofPattern("yyyy 'year'");
Mark Jeronimus
quelle
6

Sie können String.format verwenden, wie in java.util.Formatter dokumentiert :

Calendar c = ...;
String s = String.format("%tY year", c);
// -> s == "2010 year" or whatever the year actually is
R Samuel Klatchko
quelle
4

java.time

Mark Jeronimus hat es bereits gesagt . Ich konkretisiere es ein bisschen mehr. Setzen Sie den zu druckenden Text einfach in einfache Anführungszeichen.

    DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy 'year'");
    System.out.println(LocalDate.of(2010, Month.FEBRUARY, 3).format(yearFormatter));
    System.out.println(Year.of(2010).format(yearFormatter));
    System.out.println(ZonedDateTime.now(ZoneId.of("Europe/Vilnius")).format(yearFormatter));

Ausgabe beim Laufen gerade:

2010 year
2010 year
2019 year

Wenn Sie a DateTimeFormatterBuilderund seine appendPatternMethode verwenden, verwenden Sie einfache Anführungszeichen auf die gleiche Weise. Oder verwenden Sie appendLiteralstattdessen die Methode und keine einfachen Anführungszeichen.

Wie setzen wir dann ein einfaches Anführungszeichen in das Format? Zwei einfache Anführungszeichen ergeben eines. Es spielt keine Rolle, ob sich das doppelte einfache Anführungszeichen in einfachen Anführungszeichen befindet oder nicht:

    DateTimeFormatter formatterWithSingleQuote = DateTimeFormatter.ofPattern("H mm'' ss\"");
    System.out.println(LocalTime.now(ZoneId.of("Europe/London")).format(formatterWithSingleQuote));

10 28 '34 "

    DateTimeFormatter formatterWithSingleQuoteInsideSingleQuotes
            = DateTimeFormatter.ofPattern("hh 'o''clock' a, zzzz", Locale.ENGLISH);
    System.out.println(ZonedDateTime.now(ZoneId.of("America/Los_Angeles"))
            .format(formatterWithSingleQuoteInsideSingleQuotes));

02 Uhr, pazifische Sommerzeit

Alle oben genannten Formatierer können auch zum Parsen verwendet werden. Zum Beispiel:

    LocalTime time = LocalTime.parse("16 43' 56\"", formatterWithSingleQuote);
    System.out.println(time);

16:43:56

Die SimpleDateFormatKlasse, die verwendet wurde, als diese Frage vor fast 10 Jahren gestellt wurde, ist notorisch mühsam und längst veraltet. Ich empfehle stattdessen die Verwendung von java.time, der modernen Java-API für Datum und Uhrzeit. Deshalb zeige ich genau das.

Links

Ole VV
quelle
-4

java.text.SimpleDateFormat

SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd"); 
String formattedDate = formatter.format(date);

Weitere Informationen erhalten Sie hier Link-Text

Javi
quelle