7

Ich muss nur die Monats- und Jahresinformationen aus einem Java-Datum extrahieren, um sie in einer GUI anzuzeigen. Dieses Datum muss mit dem Benutzergebietsschema übersetzt werden. Ich weiß, 2 Möglichkeiten für die lokalen Termine Formatierung:Wie extrahieren Sie die Datumsfelder für die länderspezifische Formatierung in Java?

  1. Mit DateFormat.getInstance(DateFormat.LONG, locale).format(date)
  2. Mit new SimpleDateFormat("yyyy M", locale).format(date)

Für locale SIMPLIFIED_CHINESE und Datum 2013-02-18, ergibt dies:

  1. 2013 年 2 月 18日

Wir müssen das Format LONG ohne Tag verwenden (2013 年 2 月). [Die Variante 2 ist eindeutig nicht akzeptabel, da die Reihenfolge von Jahr-Monat nicht vom Gebietsschema betroffen ist]. Das Problem könnte sein: Wie entferne ich den Tagesabschnitt (18 日) vom langen Format? Ich habe versucht, mit der Methode format(Date date, StringBuffer toAppendTo, FieldPosition pos), aber dies ermöglicht nur das Extrahieren der Zahl Teil, nicht das extra Zeichen.

Das Muster der DateFormat.getInstance(DateFormat.LONG, Locale.SIMPLIFIED_CHINESE) ist yyyy'年'M'月'd'日'. Das Extrahieren des Tagesabschnitts würde yyyy'年'M'月' ergeben. Es scheint mir, dass dies nicht mit dem DateFormat-Standard von Java möglich ist, da die zusätzlichen Zeichen (, und ) nicht dem entsprechenden Feld zugeordnet sind, sondern einfach Zeichen ohne andere Semantik für den Formatierer sind.

Ich hatte einen Blick auf DateFormatSymbols und LocaleServiceProvider, aber denke, es hilft nicht. Für mich wäre der Erweiterungspunkt ein weiterer Datums-Style zur getInstance(int style) Methode hinzuzufügen. Aber es scheint nicht möglich, ohne es für alle Locale zu implementieren ...

Ist diese Analyse korrekt? Wie erreicht man diese Formatierung auf eine saubere Art und Weise?

+0

+1: Ich kann auch keinen Weg sehen, dies zu tun. Vielleicht versuchen Sie stattdessen die JodaTime-Bibliothek. –

+0

Ich habe folgendes ohne Erfolg versucht: 'YearMonth.fromCalendarFields (cal) .toString (DateTimeFormat.longDate(). WithLocale (locale))'. – Jidehem

Antwort

1

Ich glaube nicht, dass irgendwelche vordefinierten Konstanten für die Jahr-und-Monat-Formatierung im zh-CN-Gebietsschema existieren würden, also müssen Sie es formatieren.

new SimpleDateFormat("yyyy年M月").format(date) 

Wie SimpleDateFormat sagt (von mir hervorgehoben):

Datums- und Zeitformate nach Datum und Uhrzeit Musterzeichenfolgen festgelegt sind. Innerhalb der Musterzeichenfolgen für Datum und Uhrzeit werden nicht angebene Buchstaben von "A" bis "Z" und von "a" bis "z" als Musterbuchstaben interpretiert, die die Komponenten einer Datums- oder Uhrzeitzeichenfolge darstellen. Text kann mit einfachen Anführungszeichen (') zitiert werden, um eine Interpretation zu vermeiden. "''" repräsentiert ein einfaches Zitat. Alle anderen Zeichen werden nicht interpretiert; Sie werden während der Formatierung einfach in die Ausgabezeichenfolge kopiert oder beim Parsen mit der Eingabezeichenfolge verglichen.

So ist es sicher, chinesische Zeichen in die Formatzeichenfolge auf diese Weise zu setzen.

Da Java Unicode ist, können Sie die Zeichen in Ihre Quelle einfügen, solange Sie mit dem Unicode-Quellzeichensatz kompilieren.Andernfalls sollten Sie diesen String extern lesen, z. aus einer Unicode-Eigenschaftendatei oder -Datenbank.

+0

Kurz gesagt, Java bietet keine Möglichkeit, solche Formate zu internationalisieren. Es muss manuell implementiert werden. – Jidehem

+0

Ja, das ist ein spezielles Datumsformat. Wenn es einen DateTime-ähnlichen Datentyp gäbe, der nur Monat und Jahr repräsentiert, hätten wir eine größere Chance, eine eingebaute Unterstützung dafür zu haben. Es ist nicht so üblich, also musst du das benutzen. IMHO DateTime-ähnliche Datentypen sind sowieso so komplex, dass es sich nicht lohnt, es komplizierter zu machen. – gaborsch

+0

Eine weitere Möglichkeit zur Vermeidung von Codierungsproblemen besteht darin, den übersetzten Wert für Stil LONG und Hardcode abzurufen, welcher Teil des Datumsmusters das Muster behält (in unserem Fall die letzten 4 Zeichen des Musters verwerfen). Das gibt: > final Zeichenfolge patternFull = ((SimpleDateFormat) DateFormat.getDateInstance (DateFormat.LONG, Locale.SIMPLIFIED_CHINESE)). ToPattern(); final String patternYearMonth = patternFullString (0, patternFull.length() - 4); – Jidehem

Verwandte Themen