2015-04-07 2 views
13

folgender Code wird nicht gedruckt „CE“ oder „Aktuelle Zeit“:Wie kann man in Java-8 eine gemeinsame Ära ("CE") anzeigen?

System.out.println(IsoEra.CE.getDisplayName(TextStyle.SHORT, Locale.UK)); // output: AD 
System.out.println(IsoEra.CE.getDisplayName(TextStyle.FULL, Locale.UK)); // output: Anno Domini 

Natürlich IsoEra.CE.name() hilft aber nicht, wenn die vollen Anzeigenamen wie „common era“ oder „Strom-Ära“ erforderlich ist. Ich halte das für etwas merkwürdig, weil das Javadoc von IsoEra in seiner Klassenbeschreibung ausdrücklich den Begriff "Current era" erwähnt. Es funktioniert nicht einmal für das Root-Gebietsschema. Der Anwendungsfall ist hier, Kunden mit nicht-religiösem Hintergrund zu bedienen.

Dies hilft nicht, auch:

LocalDate date = LocalDate.now(); 
String year = date.format(DateTimeFormatter.ofPattern("G yyyy", Locale.UK)); // AD 2015 
System.out.println(year); 

Der einzige Weg, ich fand, ist:

TextStyle style = ...; 
Map<Long,String> eras = new HashMap<>(); 
long bce = (long) IsoEra.BCE.getValue(); // 0L 
long ce = (long) IsoEra.CE.getValue(); // 1L 
if (style == TextStyle.FULL) { 
    eras.put(bce, "Before current era"); 
    eras.put(ce, "Current era"); 
} else { 
    eras.put(bce, "BCE"); 
    eras.put(ce, "CE"); 
} 
DateTimeFormatter dtf = 
    new DateTimeFormatterBuilder() 
    .appendText(ChronoField.ERA, eras) 
    .appendPattern(" yyyy").toFormatter(); 
System.out.println(LocalDate.now().format(dtf)); // CE 2015 

Gibt es einen besseren oder kürzeren Weg?

+1

Verwenden Sie ein Gebietsschema, das die "politisch korrekte" Variante verwendet, da AD und anno domini ** die korrekten Texte für CE in den meisten westlichen Gebietsschemas sind. –

+1

@MarkRotteveel Welchen Ort schlagen Sie vor? Mit einer zusätzlichen Variante und dem Installieren der zugehörigen Ressourcen über ServiceLoader? –

+0

Wenn nur ein Locale gefunden werden könnte! Selbst die angeblich sprach- und länderneutrale Locale.ROOT wirft "AD" auf dich, als würde es aus der Mode kommen (was ich begrüßen würde). – sheltem

Antwort

1

Nein, es gibt keinen besseren Weg!

Erläuterung: "Aktuelle Epoche" (und entsprechend "vor der aktuellen Epoche") ist der "Name eines Feldes" (abstrakt/meta) des ISO-Standards. Natürlich gibt es auch keine (standardisierte) länderspezifische Übersetzung für diese Felder und kein Muster, das diese Ausgabe druckt (nach dem Standard werden sie nur in Englisch referenziert und von jdk jeweils nur als CE, BCE). Also, was die ursprüngliche Ausgabe zeigt:

AD 
    Anno Domini 

korrekt ist, und die ISO-konform (Englisch) Übersetzung der Ära (ein Datums, die „in der heutigen Zeit“ ist).

Um dies zu lösen, stimme ich absolut mit Ihrem Ansatz (der benutzerdefinierten Datumsformatierung) überein, und gehe tiefer ins Detail: Ich würde es nicht wagen, eine einzige Zeile davon zu ändern!

Das einzige Einsparpotential, das ich sehe, ist in "Initialisierung" (vielleicht eine EnumMap für die TextStyles verwenden ... und ... wie viele Sprachen möchten Sie unterstützen?) ..und "durch Refactoring".

Vielen Dank für das interessante "Problem" und eine Lösung dafür!

+1

Über ISO, dieses Papier schweigt über Epochen, also besser lassen Sie es in diesem Zusammenhang (aber Jahr Null! existiert). Sie haben wahrscheinlich recht, keine wirklich bessere Lösung möglich. Ich entdeckte, dass für 'SimpleDateFormat' in Java vor 8 die Situation noch schlimmer ist (keine langen Namen). Ich wünschte, Oracle hätte ein Herz für Menschen, die Alternativen brauchen. Im Englischen sind die Namen "common era" usw. nicht ungewöhnlich, und in Ostdeutschland gibt es auch Namen wie "v.u.Z." statt "v.Chr.". Ich denke, ich werde mit einem ServiceLoader-Mechanismus gehen und meine eigenen Textressourcen verwalten, die über eine Gebietsschema-Variante zugänglich sind. Vielen Dank. –

Verwandte Themen