2015-04-07 5 views
13

seguito il codice non viene stampata "CE" o "Era corrente":Come visualizzare era comune ("CE") in Java-8?

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 

Naturalmente, IsoEra.CE.name() aiuta ma non se è richiesto il nome visualizzato completo come "era comune" o "epoca attuale". Considero questo un po 'strano perché il javadoc di IsoEra menziona esplicitamente il termine "Era attuale" nella sua descrizione di classe. Non funziona nemmeno per le impostazioni locali di root. Il caso d'uso qui è di servire clienti con background non religioso.

Questo non aiuta, troppo:

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

L'unico modo che ho trovato è stato:

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 

C'è un modo migliore o più breve?

+1

Utilizzare una locale che utilizza la variante "politically correct", perché AD e anno domini ** sono ** i testi corretti per CE nella maggior parte delle versioni locali occidentali. –

+1

@MarkRotteveel Quale locale suggerisci? Con una parte variante extra e l'installazione di risorse associate tramite ServiceLoader? –

+0

Se solo si potesse trovare un locale! Anche la presunta lingua e country neutral Locale.ROOT lancia "AD" come se fosse fuori moda (che applaudirei). – sheltem

risposta

1

No, non esiste un modo migliore per farlo!

Spiegazione: "L'era attuale" (e in precedenza "prima dell'era corrente") è il "nome di un campo" (abstract/meta) dello standard ISO. Naturalmente c'è anche no (standardizzato) traduzione specifica per paese per questi campi e nessun modello che stampa questa uscita. (Con lo standard si fa riferimento solo in inglese e jdk rispettivamente solo come CE, BCE). Così che cosa l'uscita originale mostra:

AD 
    Anno Domini 

è corretto, e l'ISO-conformi (inglese) Traduzione del tempo (di una data che è "nell'era attuale").

Per risolvere questo, sono assolutamente d'accordo con il tuo approccio (di formattazione personalizzata della data), e approfondendo i dettagli: non oserei cambiare una sola riga di essa!

L'unico potenziale di risparmio che vedo è in "inizializzazione" (forse usare un EnumMap per gli stili di testo ... e ... quante lingue vuoi supportare?) ..e "per refactoring".

Grazie per l'interessante "problema" e fornendo una soluzione!

+1

Informazioni su ISO, questo documento è silenzioso sulle ere, quindi meglio lasciarlo fuori in questo contesto (ma l'anno zero! esiste). Probabilmente hai ragione, nessuna soluzione davvero migliore possibile. Ho scoperto che per 'SimpleDateFormat' in Java pre 8 la situazione è ancora peggiore (nessun nome di lunga data). Vorrei che Oracle avesse un cuore per le persone che hanno bisogno di alternative. In inglese i nomi "era comune" ecc. Non sono insoliti, e nella Germania dell'Est ci sono anche nomi come "v.u.Z." invece di "v.Chr.". Penso che andrò con un meccanismo ServiceLoader e gestirò le mie risorse testuali accessibili tramite una variante locale. Grazie. –