2015-09-29 16 views
6

Ho bisogno di formattare la data incompleta solo al mese di precisione. La mia prima ipotesi è stata quella di applicare il modello "MMMM yyyy" ad esso. Questo funziona bene per molti locali (inglese, tedesco, ...), ma fornisce risultati brutti per le lingue con flessione, ad es. Russo. Ho letto documentation of SimpleDateFormat e ho scoperto che "L" dovrebbe fornire un nome mese insensibile al contesto: proprio quello di cui ho bisogno, poiché non vi è alcun giorno del mese nel modello. Così ho provato invece il pattern "LLLL yyyy". Funziona perfettamente per il russo e altri linguaggi di flessione, ma invece fallisce per es. Inglese e tedesco ...Forma standalone del nome del mese in formato data Java

Ecco il codice di prova:

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())); 
    } 
} 

e la sua uscita:

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 

Così, per i locali testati: 'it' e 'de' opera correttamente solo con 'M', 'hu' va bene sia con 'M' che con 'L', 'it' è probabilmente meglio con 'L' (non so quanto sia importante la maiuscola qui), mentre 'ru', 'fi' e 'pl' danno l'output corretto solo con 'L' (questo posso davvero dire solo per russo e polacco, ma presumo che sia simile in finlandese).

Domande:

  • Posso fare qualcosa per rendere SimpleDateFormat o un simile formattazione della data classe treat 'L' correttamente per tutte le lingue?

  • In alternativa, c'è un modo semplice per dire se "M" o "L" dovrebbero essere usati per qualsiasi locale?

+0

Non parlo russo ma stai dicendo che l'identificatore 'M' fornisce un nome mese errato? Qual è la differenza di significato tra "сентября" e "Сентябрь"? – Tunaki

+1

Come in finlandese. Il nome del mese è syyskuu. Ma se c'è un giorno menzionato deve essere: 15. syyskuuta (che è il significato di forma standalone vs. sensibile al contesto). –

+1

Quale versione di Java 8 stai usando? Il 'L' è stato introdotto solo in Java 8, e sulla mia macchina il tuo programma produce" September "anche per' en' e 'de'. Forse hai una versione con file locali obsoleti? – RealSkeptic

risposta

3

Si tratta di un bug di ufficiale - JDK-8075548

Il bug è in stato "risolto", e si può vedere che la correzione è stata backport alle versioni 8_60 e 8_65, ma non le versioni precedenti di Java 8

Pertanto, la soluzione corretta, se possibile, è l'aggiornamento a Java 1.8.0_60.

+0

Sì, funziona con l'aggiornamento 60 come previsto. Grazie. – doublep

0

java.time

La classe SimpleDateFormat fa parte delle classi fastidiosi scendere Data in tempo che ora sono l'eredità, soppiantato dalle classi java.time.

In java.time, i codici del modello di formattazione sono simili a quelli precedenti ma seguono esattamente lo stesso. Assicurati di studiare la classe doc per DateTimeFormatter.

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

: marzo 2017 | 3 2017

fr: mars 2017 | 3 2017

ma

: März 2017 | 3 2017

en: marzo 2017 | Marzo 2017

esso: marzo 2017 | Marzo 2017

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

fi: maaliskuuta 2017 | maaliskuu 2017

ad esempio marca 2017 | Marzo 2017


Chi java.time java.time Il quadro è integrato in Java 8 e versioni successive. Queste classi soppiantare le vecchie fastidioso legacy classi data-ora java.util.Date Come ad esempio, Calendar, & SimpleDateFormat.

Joda-Time Il progetto, ora in maintenance mode, java.time consigliati migrazione alle classi.

Per ulteriori informazioni, vedere la Oracle Tutorial. Stack Overflow e la ricerca di esempi e molte spiegazioni. Specifica è JSR 310.

Dove ottenere le classi java.time?

ThreeTen-Extra Il progetto java.time estende con classi aggiuntive.Questo progetto è un terreno di prova per possibili aggiunte future a java.time. È possibile trovare alcune classi utili come Interval, YearWeek, YearQuarter e more.

Problemi correlati