Come controllare le maiuscole dei nomi di mesi e giorni restituiti da DateFormat?
-
09-06-2019 - |
Domanda
Ecco un programma di test rapido:
public static void main( String[] args )
{
Date date = Calendar.getInstance().getTime();
System.out.println("Months:");
printDate( "MMMM", "en", date );
printDate( "MMMM", "es", date );
printDate( "MMMM", "fr", date );
printDate( "MMMM", "de", date );
System.out.println("Days:");
printDate( "EEEE", "en", date );
printDate( "EEEE", "es", date );
printDate( "EEEE", "fr", date );
printDate( "EEEE", "de", date );
}
public static void printDate( String format, String locale, Date date )
{
System.out.println( locale + ": " + (new SimpleDateFormat( format, new Locale( locale ) )).format( date ) );
}
L'output è:
Months:
en: September
es: septiembre
fr: septembre
de: September
Days:
en: Monday
es: lunes
fr: lundi
de: Montag
Come posso controllare le maiuscole dei nomi.Per qualche ragione lo spagnolo e il francese sembrano restituire sempre nomi che iniziano con una lettera minuscola.
Soluzione
Non tutte le lingue condividono le regole per l'uso delle maiuscole in inglese.Immagino che dovresti modificare i dati utilizzati dall'API, ma i tuoi clienti non inglesi potrebbero non apprezzarlo...
Altri suggerimenti
Le regole per l'uso delle maiuscole sono diverse per le diverse lingue.In francese, nomi dei mesi non dovrebbe essere maiuscolo.
Potresti non voler cambiare le maiuscole: culture diverse usano parole diverse in maiuscolo (ad esempio, in tedesco si scrive in maiuscolo ogni sostantivo, non solo i nomi propri).
tl; dott
Come posso controllare le maiuscole dei nomi
Tu no.Lingue e culture diverse hanno regole diverse riguardo alle maiuscole, alla punteggiatura, alle abbreviazioni, ecc.
Month.from( LocalDate.now( ZoneId.of( "Pacific/Auckland" ) ) ) // Get current month.
.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) // Localize automatically. Specify `Locale` to determine human language and cultural norms for translation.
più febbrile
LocalDate.now( ZoneId.of( "Pacific/Auckland" ) ) // Get current date as seen by people in a certain region (time zone).
.getDayOfWeek() // Get the day-of-week as a pre-defined `DayOfWeek` enum object.
.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH )
lundi
Localizzare
Come altri hanno affermato, non dovresti forzare le tue nozioni parrocchiali (inglese americano?) di capitalizzazione.Utilizza una libreria data-ora decente e lascia che venga localizzata automaticamente per te.
java.time
Stai utilizzando terribili vecchie classi data-ora che ora sono legacy, soppiantate dalle classi java.time.
IL LocalDate
La classe rappresenta un valore di sola data senza ora del giorno e senza fuso orario.
Il fuso orario è fondamentale per determinare una data.In ogni dato momento, la data varia in tutto il mondo in base alla zona.Ad esempio, pochi minuti dopo la mezzanotte Parigi, Francia è un nuovo giorno mentre è ancora “ieri”. Montreal, Quebec.
Specificare a nome corretto del fuso orario nel formato di continent/region
, ad esempio America/Montreal
, Africa/Casablanca
, O Pacific/Auckland
.Non utilizzare mai l'abbreviazione di 3-4 lettere come EST
O IST
come sono non fusi orari reali, non standardizzati e nemmeno unici (!).
ZoneId z = ZoneId.of( "Asia/Kolkata" );
LocalDate today = LocalDate.now( z );
Per lavorare con un mese, estrai a Month
oggetto enum.Idem per il giorno della settimana, DayOfWeek
.
Chiamata getDisplayName
.Passare un TextStyle
per abbreviazione.Passare un Locale
determinare (a) la lingua umana per la traduzione del nome del giorno, del nome del mese e simili, e (b) le norme culturali che decidono questioni di abbreviazione, maiuscole, punteggiatura, separatori e simili.Notare che Locale
ha Niente a che fare con il fuso orario.
Month m = today.getMonth() ;
String mNameQuébec = m.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ;
String mNameGermany = m.getDisplayName( TextStyle.FULL , Locale.GERMANY ) ;
…E…
DayOfWeek dow = today.getDayOfWeek() ;
String dowNameQuébec = dow.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ;
String dowNameGermany = dow.getDisplayName( TextStyle.FULL , Locale.GERMANY ) ;
Di java.time
IL java.time framework è integrato in Java 8 e versioni successive.Queste classi soppiantano quelle vecchie e fastidiose eredità classi data-ora come java.util.Date
, Calendar
, & SimpleDateFormat
.
IL Joda-Time progetto, ora in Modalità di manutenzione, consiglia la migrazione al java.time classi.
Per saperne di più, vedere il Tutorial sull'Oracolo.E cerca Stack Overflow per molti esempi e spiegazioni.La specifica è JSR310.
Con un driver JDBC rispettare JDBC4.2 o più tardi, puoi scambiare java.time oggetti direttamente con il tuo database.Non sono necessarie stringhe o classi java.sql.*.
Dove ottenere le classi java.time?
- JavaSE8, JavaSE9, e più tardi
- Integrato.
- Parte dell'API Java standard con un'implementazione in bundle.
- Java 9 aggiunge alcune funzionalità e correzioni minori.
- JavaSE6 E JavaSE7
- Gran parte della funzionalità java.time è retroportata su Java 6 e 7 in ThreeTen-Backport.
- Androide
- Versioni successive delle implementazioni dei bundle Android delle classi java.time.
- Per le versioni precedenti di Android, il TredieciABP il progetto si adatta ThreeTen-Backport (menzionato sopra).Vedere Come utilizzare ThreeTenABP….
IL Tredieci-Extra il progetto estende java.time con classi aggiuntive.Questo progetto è un banco di prova per possibili future aggiunte a java.time.Potresti trovare alcune classi utili qui come Interval
, YearWeek
, YearQuarter
, E Di più.
Adesso ho un problema con il punto in cui una frase inizia con "dimanche 07 mars", che non avrebbe importanza se non fosse all'inizio di una frase.Immagino che questo non possa essere modificato, a meno che non esegua la manipolazione manuale della stringa sul primo carattere della stringa.