Ich mag es, das lokale Zeitformat in eine Zeichenfolge ohne das Jahr zu formatieren. Im Moment kann ich das lokale Format mit dem Jahr zeigen:
%Vor%daher erhalte ich eine Zeitzeichenfolgenausgabe wie
%Vor%für die verschiedenen Länder. Jetzt möchte ich ein kurzes Formular wie
bekommen %Vor%Wie würde ich das tun?
Danke für Ihre Hilfe!
Sie können verwenden SimpleDateFormat
:
Ausgabe:
%Vor%BEARBEITEN:
Nachdem wir die Gebietsschema-Formate weiter untersucht und Peters Antwort erweitert haben, gibt es hier einen Code, der Demonstrator-Unterschiede zwischen toPattern()
und toLocalizedPattern()
zeigt:
Erzeugt folgende Ausgabe:
%Vor%Also abschließend, um ein lokales Datum ohne ein Jahr anzuzeigen:
String yearlessPattern = DateFormat.getDateInstance(DateFormat.SHORT).toPattern().replaceAll("\W?[Yy]+\W?", "");
Ich musste das Datum in das String-Entfernungsjahr umwandeln. String sollte Gebietsschemaeinstellungen beibehalten. Das Datumsformat ist vom Typ DateFormat.LONG
, nicht DateFormat.SHORT
. Z. B. ist die vollständige Zeichenfolge September 18, 2012
, nicht 09/18/12
.
Meine Lösung (basierend auf Alex Beitrag):
%Vor%Programmausgabe:
Gebietsschema Vollständiges Datum Muster Jahrloses Datum Muster ohne Jahreszahl
Japan 2012/09/18 jjjj / MM / dd 09/18 MM / dd
Japan H24.09.18 Gy.MM.dd 09.18 MM.dd >
Vereinigte Staaten 18. September 2012 MMMM d, yyyy 18. September MMMM d kbd>
Spanien 18 de septiembre de 2012 de 'MMMM' de 'yyyy 18 de septiembre < kbd> d 'de' MMMM
Vereinigte Staaten 18 de septiembre de 2012 von 'MMMM' de 'yyyy 18 de septiembre d 'de' MMMM
Ukraine 18 вересня 2012 d MMMM jjjj 18 вересня d MMMM
Spanien 18 / septembre / 2012 d '/' MMMM '/' yyyy 18 / septembre < kbd> d '/' MMMM
Russland 18 Сентябрь 2012 г. d MMMM jjjj 'г.' 18 Сентябрь d MMMM
China 2012 年 9 月 18 日 jjjj '年' M '月' d '日' 9 月 18 日 M '' d ''
Frankreich 18 september 2012 d MMMM jjjj 18 september d MMMM
Deutschland 18. September 2012 d. MMMM yyyy 18. September d. MMMM
Schweden den 18. September 2012 'den' d MMMM yyyy den 18. September 'den 'd MMMM
Es gibt kein vordefiniertes Format, um dies zu erreichen. Hier ist ein Workaround: Formatieren Sie das Datum mit java.text.DateFormat.SHORT
und mit einem benutzerdefinierten Formatierer mit dem Format yyyy
. Jetzt suche das Ergebnis des ersteren nach dem letzteren.
Wenn das Jahr nahe am Anfang ist, entfernen Sie die nächste Nicht-Ziffer nach dem Jahr, andernfalls entfernen Sie Ziffern vor dem Jahr.
Aber das ist auch nicht perfekt, weil es Ihnen "12.3" statt "12.3" gibt. für Deutsch.
Wenn Sie es wirklich richtig machen müssen, schauen Sie in den Java-Quellcode, speziell das Paket sun.text.resources
in rt.jar
und drucken Sie alle Gebietsschemata aus (Sie können einfach eine DateFormat
mit dem Typ SHORT
für erstellen alle Ländereinstellungen).
Damit sollten Sie alle Daten erhalten, die Sie benötigen, um ein eigenes Ressourcenbündel mit Tag / Monat-Formatzeichenfolgen für alle Sprachen zu erstellen.
Sie können das Muster extrahieren und das Jahr entfernen.
%Vor%druckt
%Vor%auf meinem System.
Andere Autoren haben richtig erkannt, dass die Java-Plattform nicht vordefinierte lokalisierte Formatmuster für eine Monat-Tag-Kombination ohne Jahr verwaltet, so dass komplexe Problemumgehungen wie die Verwendung von Datenanalyse und Regexp-Mustern vorgeschlagen wurden.
Ich habe solche Formatmuster in meine Bibliothek eingebettet Time4J basierend auf den neuesten CLDR-Daten. Beispiel:
%Vor%Gut zu wissen: ICU4J hat diese Fähigkeit auch, aber mit einer viel komplexeren API.
Wie Sie wahrscheinlich wissen, hängen kurze Formate nicht nur von der Sprache, sondern auch vom Land ab. Leider sind solche Muster in Java nicht enthalten. Stattdessen müssen Sie möglicherweise die von CLDR definierten Suchkriterien verwenden. Suchen Sie nach " Muster "oder" Md "(Monat / Tag Muster).
Allerdings muss ich Sie warnen, dass diese Muster fehlerhaft sein könnten. Stattdessen sollten Sie sie in die Ressourcendatei verschieben und die Übersetzer mit ihnen umgehen lassen (ein entsprechender Kommentar dazu, was es ist und wie damit umgegangen werden soll.)
java.time.MonthDay
Java bietet eine Klasse an, die einen solchen Wert, einen Monat und einen Tag ohne jedes Jahr darstellt: java.time.MonthDay
Wenn Sie toString
aufrufen, Sie erhalten eine Zeichenfolge, die im Format nach dem ISO 8601 Standard, --MM-DD
, generiert wird. Das ist das Extended-Format, und der Standard erlaubt auch das Basic-Format, das die Verwendung von Separatoren minimiert, --MMDD
. Referenz: Abschnitt 5.2.1.3 Verkürzte Darstellungen d) Ein bestimmter Tag eines Monats im angegebenen Jahr des Standards ISO 8601: 2000.
- 12-03
Ich empfehle, wenn immer möglich, die Standardformate zu verwenden. Wenn Sie jedoch andere Formate verwenden müssen, können Sie dies mit dem DateTimeFormatter
angeben. Klasse.
12/03
Die Klassen java.time ermöglichen die automatische Lokalisierung von nur Datumswerte und Datum / Uhrzeit-Werte . Leider keine solche Unterstützung für Monat-Tag-Werte. Sie müssen also Ihr eigenes benutzerdefiniertes Format explizit für Ihre gewünschte Lokalisierung definieren. Für Alternativen, siehe die Antwort von Meno Hochschild .
Tags und Links java localization date-format