java lokales Zeitformat ohne Jahr

7

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!

    
Anthea 15.03.2012, 13:32
quelle

7 Antworten

11

Sie können verwenden SimpleDateFormat :

%Vor%

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:

%Vor%

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?", "");

    
Alex 15.03.2012, 13:36
quelle
6

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

    
Exterminator13 19.09.2012 08:11
quelle
2

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.

    
Aaron Digulla 15.03.2012 13:48
quelle
1

Sie können das Muster extrahieren und das Jahr entfernen.

%Vor%

druckt

%Vor%

auf meinem System.

    
Peter Lawrey 15.03.2012 13:54
quelle
1

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.

    
Meno Hochschild 23.09.2016 17:20
quelle
0

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.)

    
Paweł Dyda 15.03.2012 14:07
quelle
0

java.time.MonthDay

Java bietet eine Klasse an, die einen solchen Wert, einen Monat und einen Tag ohne jedes Jahr darstellt: java.time.MonthDay

%Vor%

ISO 8601

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.

%Vor%
  

- 12-03

Benutzerdefinierte Formate

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.

%Vor%
  

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 .

    
Basil Bourque 22.09.2016 23:46
quelle

Tags und Links