Como controlar a capitalização dos nomes de meses e dias retornados por DateFormat?
-
09-06-2019 - |
Pergunta
Aqui está um programa de teste rápido:
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 ) );
}
A saída é:
Months:
en: September
es: septiembre
fr: septembre
de: September
Days:
en: Monday
es: lunes
fr: lundi
de: Montag
Como posso controlar a capitalização dos nomes.Por alguma razão, o espanhol e o francês sempre parecem retornar nomes que começam com letra minúscula.
Solução
Nem todos os idiomas compartilham regras de capitalização em inglês.Acho que você precisaria alterar os dados usados pela API, mas seus clientes que não falam inglês podem não gostar disso...
Outras dicas
As regras de capitalização são diferentes para idiomas diferentes.Em francês, nomes de meses não deve ser capitalizado.
Você pode não querer alterar a capitalização - diferentes culturas colocam palavras diferentes em maiúscula (por exemplo, em alemão você coloca todos os substantivos em maiúscula, não apenas os nomes próprios).
dr.
Como posso controlar a capitalização dos nomes
Você não.Diferentes idiomas e diferentes culturas têm regras diferentes sobre letras maiúsculas, pontuação, abreviaturas, etc.
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.
fevereiro
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
Localizar
Como outros afirmaram, você não deveria forçar suas próprias noções paroquiais (inglês dos EUA?) de capitalização.Use uma biblioteca de data e hora decente e deixe-a localizar automaticamente para você.
java.time
Você está usando classes de data e hora terríveis e antigas que agora são herdadas, suplantadas pelas classes java.time.
O LocalDate
class representa um valor somente de data, sem hora do dia e sem fuso horário.
Um fuso horário é crucial para determinar uma data.Para qualquer momento, a data varia em todo o mundo por zona.Por exemplo, alguns minutos depois da meia-noite em Paris, França é um novo dia enquanto ainda “ontem” em Montreal Quebec.
Especifique um nome correto do fuso horário no formato de continent/region
, como America/Montreal
, Africa/Casablanca
, ou Pacific/Auckland
.Nunca use abreviações de 3 a 4 letras, como EST
ou IST
como eles são não fusos horários verdadeiros, não padronizados e nem mesmo únicos (!).
ZoneId z = ZoneId.of( "Asia/Kolkata" );
LocalDate today = LocalDate.now( z );
Para trabalhar com um mês, extraia um Month
objeto enum.O mesmo vale para o dia da semana, DayOfWeek
.
Chamar getDisplayName
.Passe um TextStyle
para abreviação.Passe um Locale
determinar (a) a linguagem humana para tradução do nome do dia, nome do mês e outros, e (b) as normas culturais que decidem questões de abreviatura, letras maiúsculas, pontuação, separadores e outros.Observe que Locale
tem nada a ver com fuso horário.
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 dowNameAlemanha = dow.getDisplayName(TextStyle.FULL, Locale.GERMANY);
Sobre java.time
O java.time framework é integrado ao Java 8 e posterior.Essas aulas substituem as velhas e problemáticas legado classes de data e hora, como java.util.Date
, Calendar
, & SimpleDateFormat
.
O Hora Joda projeto, agora em Modo de manutenção, aconselha a migração para o java.time Aulas.
Para saber mais, consulte o Tutorial Oráculo.E pesquise no Stack Overflow muitos exemplos e explicações.A especificação é JSR 310.
Com um Driver JDBC cumprindo JDBC4.2 ou mais tarde, você pode trocar java.time objetos diretamente com seu banco de dados.Não há necessidade de strings ou classes java.sql.*.
Onde obter as classes java.time?
- Java SE 8, Java SE 9, e depois
- Construídas em.
- Parte da API Java padrão com uma implementação agrupada.
- Java 9 adiciona alguns recursos e correções menores.
- Java SE 6 e Java SE 7
- Grande parte da funcionalidade java.time é portada para Java 6 e 7 em ThreeTen-Backport.
- Android
- Versões posteriores de implementações de pacotes Android das classes java.time.
- Para Android anterior, o TrêsTenABP projeto se adapta ThreeTen-Backport (Mencionado acima).Ver Como usar o ThreeTenABP….
O Três Dez-Extra projeto estende java.time com classes adicionais.Este projeto é um campo de provas para possíveis adições futuras ao java.time.Você pode encontrar algumas classes úteis aqui, como Interval
, YearWeek
, YearQuarter
, e mais.
Estou tendo um problema agora onde uma frase começa com "dimanche 07 mars", o que não faria diferença se não estivesse no início de uma frase.Acho que isso não pode ser alterado, a menos que eu faça manipulação manual da string no primeiro caractere da string.