java lokalen timeformat ohne Jahr
Ich gerne formatieren Sie die lokalen timeformat in einen string, ohne Jahr. Im moment bin ich in der Lage zu zeigen, die lokalen format mit Jahr:
java.text.DateFormat df = java.text.DateFormat.getDateInstance(java.text.DateFormat.SHORT);
String dateString = df.format(date);
daher erhalte ich eine Uhrzeit-Zeichenfolge ausgegeben wie
12.03.2012
03/12/2012
für die verschiedenen Länder. Jetzt möchte ich eine kurze form wie
12.03.
03/12
wie kann ich dies tun?
vielen Dank für Ihre Hilfe!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
SimpleDateFormat
:Ausgabe:
EDIT:
Nachdem die Erforschung Gebietsschema-Formate weiter, und die Erweiterung auf Peters Antwort, hier einige code-demonstrator die Unterschiede zwischen
toPattern()
undtoLocalizedPattern()
:Erzeugt folgende Ausgabe:
Also abschließend zur Anzeige einer lokalisierten Datum ohne Jahr:
String yearlessPattern = DateFormat.getDateInstance(DateFormat.SHORT).toPattern().replaceAll("\\W?[Yy]+\\W?", "");
Ich die Konvertierung von Datum in String entfernen Jahr. String sollte halten locale-Einstellungen. Datum-format ist vom Typ
DateFormat.LONG
, nichtDateFormat.SHORT
. E. g., vollständige Zeichenfolge istSeptember 18, 2012
, nicht09/18/12
.Meine Lösung (basierend auf Alex post):
Programm-Ausgabe:
Gebietsschema Komplett date Pattern Yearless Datum Yearless Muster
Japan 2012/09/18 yyyy/MM/dd 09/18 MM/dd
Japan H24.09.18 Gy.MM.dd 09.18 MM. dd
USA September 18, 2012 MMMM d, yyyy September 18 MMMM d
Spanien 18 de septiembre de 2012d' de 'MMMM' de 'yyyy 18 de septiembre d' de 'MMMM
USA 18 de septiembre de 2012d' de 'MMMM' de 'yyyy 18 de septiembre d' de 'MMMM
Ukraine 18 вересня 2012 d MMMM yyyy 18 вересня d MMMM
Spanien 18 /setembre /2012 d' /'MMMM' /'yyyy 18 /setembre d' /'MMMM
Russland 18 Сентябрь 2012 г. d MMMM yyyy 'г.' 18 Сентябрь d MMMM
China 2012年9月18日 yyyy'年'M '月'd'日' 9月18日 M'月'd'日'
Frankreich 18 septembre 2012 d MMMM yyyy 18 septembre 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
pattern.contains("de") ? "[^Mm]*[Yy]+[^Mm]*" : "[^DdMm]*[Yy]+[^DdMm]
?DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date())
.Gibt es kein vordefiniertes format zu erreichen. Hier ist eine Problemumgehung: Formatieren Sie das Datum mit
java.text.DateFormat.SHORT
und mit einer benutzerdefinierten Formatierung mit dem formatyyyy
. Nun suchen Sie das Ergebnis der erstere für das letztere.Wenn das Jahr in der Nähe der Anfang, entfernen nächsten nicht-Ziffer nach dem Jahr, sonst strip nicht-Ziffern, die vor dem Jahr.
Aber das ist auch nicht perfekt, weil es Sie gibt "12.3" statt "12.3." für Deutsch.
Wenn Sie wirklich brauchen, um es richtig zu machen, schauen Sie in die Java-source-code, speziell das Paket
sun.text.resources
imrt.jar
und drucken alle locale-Daten (Sie können einfach eineDateFormat
mit Typ -SHORT
für alle Gebietsschemen).Danach sollten Sie alle Daten, die Sie benötigen, um erstellen Sie Ihre eigenen Ressourcen-bundle mit Tag/Monat als format-strings für alle Sprachen.
Können Sie extrahieren Sie die Muster und entfernen Sie die Jahr.
Drucke
auf meinem system.
Andere Autoren haben richtig erkannt, dass die Java-Plattform nicht verwalten vordefinierte lokalisierten format Muster für einen Monat-Tag-Kombination ohne Jahr so komplexe workarounds wie mit Daten Analyse und regexp-Muster vorgeschlagen wurden.
Ich haben embedded-format-Muster in meine Bibliothek Time4J basierend auf den neuesten CLDR-Daten. Beispiel:
Gut zu wissen: ICU4J hat diese Fähigkeit auch, aber mit einem weit komplexeren API.
Als Sie wahrscheinlich zu realisieren, kurze Formate hängt nicht nur von Sprache, sondern auch auf Land. Leider gibt es keine solche Muster-built-in in Java. Stattdessen müssen Sie möglicherweise verwenden Sie diejenigen, definiert durch CLDR - Suche für "Muster" oder "Md" (Monat /Tag Muster).
Allerdings muss ich Sie warnen, dass diese Muster könnten buggy sein. Stattdessen möchten Sie vielleicht, um Sie zu bewegen, um die Ressource-Datei und lassen Sie die übersetzer, mit Ihnen umzugehen (einen entsprechenden Kommentar auf das, was es ist und wie damit umzugehen wäre erforderlich.)
java.time.MonthDay
Java bietet eine Klasse repräsentieren einen Wert, einen Monat und einen Tag-des-Monats ohne Jahr:
java.Zeit.MonthDay
ISO 8601
Wenn Sie anrufen
toString
, erhalten Sie einen string erzeugt, in dem format, nach der ISO 8601 standard--MM-DD
. Das ist die Extended-format und dem standard ermöglicht auch für das Grundlegende format Minimierung des Einsatzes von Separatoren--MMDD
. Referenz: Abschnitt 5.2.1.3 Abgeschnitten Darstellungen d) Einen bestimmten Tag eines Monats, in der implizite Jahr der ISO 8601:2000 standard.Benutzerdefinierte Formate
Schlage ich vor, den standard-Formaten, Wann immer möglich. Aber wenn Sie andere Formate verwenden, können Sie angeben, mit der
DateTimeFormatter
Klasse.Java.Zeit-Klassen bieten für die automatische Lokalisierung von nur-Datum-Werte und Datum-Zeit-Werte. Leider kein support für Monat-Tag-Werte. So haben Sie, definieren Sie Ihre eigenen benutzerdefinierten format explizit für Ihren gewünschten Lokalisierung. Für alternativen siehe die Antwort von Meno Hochschild.
--MM-DD
(Extended-format) und--MMDD
(Basic-format) im Abschnitt 5.2.1.3 Abgeschnitten Darstellungen unter Teil d) an Einem bestimmten Tag des Monats, in dem stillschweigenden Jahr.