2015-09-29 7 views
6

Ich muss unvollständiges Datum nur in Monatsgenauigkeit formatieren. Meine erste Vermutung war, das Muster "MMMM yyyy" darauf anzuwenden. Dies funktioniert für viele Gebietsschemas (Englisch, Deutsch, ...) gut, ergibt aber ein unschönes Ergebnis für Sprachen mit Flexion, z. Russisch. Ich las documentation of SimpleDateFormat und fand, dass 'L' kontextunempfindlichen Monatsnamen geben soll: genau was ich brauche, da es keinen Tag des Monats im Muster gibt. Also habe ich stattdessen das Muster "LLLL yyyy" ausprobiert. Es funktioniert perfekt für russische und andere Flexionssprachen, aber versagt z. Englisch und Deutsch ...Eigenständige Form des Monatsnamens im Java-Datumsformat

Hier ist der Testcode:

import java.text.*; 
import java.util.*; 

public class test 
{ 
    public static void main (String[] arguments) throws Exception 
    { 
     for (String locale : new String[] { "en", "de", "hu", "it", "ru", "fi", "pl" }) 
      System.out.format ("%s: %s \t%s\n", locale, 
           new SimpleDateFormat ("MMMM yyyy", new Locale (locale)).format (new Date()), 
           new SimpleDateFormat ("LLLL yyyy", new Locale (locale)).format (new Date())); 
    } 
} 

und seine Ausgabe:

en: September 2015  0009 2015 
de: September 2015  0009 2015 
hu: szeptember 2015  szeptember 2015 
it: settembre 2015  Settembre 2015 
ru: сентября 2015  Сентябрь 2015 
fi: syyskuuta 2015  syyskuu 2015 
pl: września 2015  wrzesień 2015 

Also, für die getesteten locales: 'de' und 'de' Arbeit richtig nur mit 'M', 'hu' geht es gut mit 'M' und 'L', 'es ist wahrscheinlich besser dran mit' L '(weiß nicht, wie wichtig der Großbuchstabe hier ist), während' ru ', "fi" und "pl" geben die korrekte Ausgabe nur mit "L" (das kann ich wirklich nur für Russisch und Polnisch sagen, aber ich nehme an, dass es auf Finnisch ähnlich ist).

Fragen:

  • Kann ich etwas tun SimpleDateFormat oder eine ähnliche Datumsformatierung Klasse treat ‚L‘ für alle Gegenden richtig zu machen?

  • Oder gibt es eine einfache Möglichkeit zu sagen, ob 'M' oder 'L' für ein bestimmtes Gebietsschema verwendet werden soll?

+0

Ich spreche kein Russisch, aber sagst du, dass "M" Bezeichner einen falschen Monatsnamen gibt? Was ist der Bedeutungsunterschied zwischen 'сентября' und 'Сентябрь'? – Tunaki

+1

Wie in Finnisch. Der Name des Monats ist syyskuu. Aber wenn ein Tag erwähnt wird, muss es sein: 15. syyskuuta (das ist die Bedeutung von Standalone-Form vs. kontextsensitiv). –

+1

Welche Version von Java 8 verwenden Sie? Das 'L' wurde nur in Java 8 eingeführt, und auf meiner Maschine erzeugt Ihr Programm" September "für' en' und 'de'. Vielleicht haben Sie eine Version mit veralteten Locale-Dateien? – RealSkeptic

Antwort

3

Es ist eine offizielle Bug - JDK-8075548

Der Fehler in Status „gelöst“, und man kann sehen, dass das Update auf die Versionen zurückportiert wurde 8_60 und 8_65, aber nicht frühere Versionen von Java 8 .

Daher ist die richtige Lösung, wenn möglich, ein Upgrade auf Java 1.8.0_60.

+0

Ja, arbeitet mit Upgrade 60 wie erwartet. Vielen Dank. – doublep

0

java.time

Die SimpleDateFormat Klasse ist Teil der störenden alten Datum-Zeit-Klassen, die jetzt Vermächtnis sind, die von den java.time Klassen verdrängten.

In java.time sind die Formatierungsmuster-Codes ähnlich wie die alten, aber als nächstes genau gleich. Achten Sie darauf, Klasse Dokument für DateTimeFormatter zu studieren.

final DateTimeFormatter fCombo = DateTimeFormatter.ofPattern ("MMMM uuuu"); 
final DateTimeFormatter fStandalone = DateTimeFormatter.ofPattern ("LLLL uuuu"); 

final LocalDate localDate = LocalDate.now (ZoneId.of ("America/Montreal")); 
for (final String locale : new String[] { "en" , "fr" , "de" , "hu" , "it" , "ru" , "fi" , "pl" }) { 
    final Locale l = new Locale (locale); 

    System.out.format (
      "%s: %s | %s\n", 
      locale, 
      localDate.format (fCombo.withLocale (l)), 
      localDate.format (fStandalone.withLocale (l)) 
    ); 
} 
en

: März 2017 | 3 2017

fr: mars 2017 | 3 2017

aber

: März 2017 | 3 2017

en: März 2017 | 2017 März

es: März 2017 | Marzo 2017

ru: марта 2017 | Март 2017

fi: maaliskuuta 2017 | maaliskuu 2017

zB marca 2017 | Marzec 2017


Über java.time java.time Der Rahmen ist in Java 8 gebaut und später. Diese Klassen ersetzen die alten Störende legacy Datum Zeitklassen java.util.Date Wie, Calendar, & SimpleDateFormat.

Joda-Time Das Projekt, das jetzt in maintenance mode berät java.time Migration in die Klassen.

mehr zu erfahren, finden Sie in der Oracle Tutorial. Stapelüberlauf und die Suche nach Beispielen und vielen Erklärungen. Spezifikation ist JSR 310.

Wo die java.time Klassen erhalten?

  • Java SE 8 und SE 9 und später
    • Built-in.
    • Ein Teil des Standard-Java-API mit einem gebündelten Implementierung.
    • Java 9 fügt einige kleinere Features und Korrekturen.
  • Java SE 6 und SE 7
    • Ein großer Teil der java.time Funktionalität ist auch mit Java 6 7 & in ThreeTen-Backport-zurück portiert.
  • Android

ThreeTen-Extra Das Projekt erstreckt sich java.time mit zusätzlichen Klassen.Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von java.time. Hier finden Sie einige nützliche Klassen wie Interval, , YearQuarter und more.

Verwandte Themen