Como controlar a capitalização dos nomes de meses e dias retornados por DateFormat?

StackOverflow https://stackoverflow.com/questions/66750

  •  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.

Foi útil?

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...

about.com sobre letras maiúsculas em francês

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top