Eu sei que isso vai me dar o dia do mês como um número ( 11
, 21
, 23
):
SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");
Mas como você formata o dia do mês para incluir um indicador ordinal , digamos 11th
, 21st
ou 23rd
?
java
date
simpledateformat
ordinal
Ken Hume
fonte
fonte
SimpleDateFormat
aula. Não é apenas desatualizado há muito tempo, também é notoriamente problemático. Hoje, temos muito melhorjava.time
, a moderna API de data e hora de Java e suasDateTimeFormatter
.Respostas:
A tabela do @kaliatech é boa, mas, como as mesmas informações são repetidas, abre a chance de um bug. Na verdade, esse erro existe na tabela para
7tn
,17tn
e27tn
(esse erro pode ser corrigido com o passar do tempo devido à natureza fluida do StackOverflow, portanto, verifique o histórico da versão na resposta para ver o erro).fonte
Não há nada no JDK para fazer isso.
Ou usando o Calendário:
Por comentários de @ thorbjørn-ravn-andersen, uma tabela como essa pode ser útil ao localizar:
fonte
fonte
java.lang.IllegalArgumentException
por causa de "um caractere de padrão ilegal, t".A pergunta é um pouco antiga. Como esta pergunta é muito barulhenta, postando o que resolvi com o método estático como um utilitário. Basta copiar, colar e usá-lo!
Para testar a purose
Exemplo: chamando-o do método principal!
Resultado:
fonte
fonte
Eu gostaria de contribuir com a resposta moderna. A
SimpleDateFormat
aula foi boa para usar quando a pergunta foi feita há oito anos, mas você deve evitá-la agora, pois ela não só está desatualizada há muito tempo, mas também é notoriamente problemática. Use emjava.time
vez disso.Editar
DateTimeFormatterBuilder.appendText(TemporalField, Map<Long, String>)
é ótimo para esse fim. Utilizando-o, construímos um formatador que faz o trabalho para nós:A saída desse snippet é:
Resposta antiga
Este código é mais curto, mas IMHO não é tão elegante.
Executando esse trecho agora que eu recebi
Um dos muitos recursos
java.time
é que é simples e confiável obter o dia do mês como umint
, o que é obviamente necessário para escolher o sufixo certo da tabela.Eu recomendo que você escreva um teste de unidade também.
PS Um formatador semelhante também pode ser usado para analisar uma seqüência de data contendo números ordinais, como
1st
,2nd
, etc. Isso foi feito em esta pergunta: Java - data Parse com segundos opcionais .Link: Tutorial do Oracle: Data e hora explicando como usar
java.time
.fonte
Se você tentar conhecer o i18n, a solução ficará ainda mais complicada.
O problema é que, em outras línguas, o sufixo pode depender não apenas do número em si, mas também do substantivo que conta. Por exemplo, em russo, seria "2-ой день", mas "2-ая неделя" (isso significa "2º dia", mas "2ª semana"). Isso não se aplica se formatarmos apenas dias, mas, em um caso um pouco mais genérico, você deve estar ciente da complexidade.
Acho que a melhor solução (não tive tempo de implementar) seria estender o SimpleDateFormetter para aplicar o MessageFormat com reconhecimento de localidade antes de passar para a classe pai. Dessa forma, você poderá oferecer suporte aos formatos% M para obter "3º",% MM para "3º" e% MMM para "3º". De fora desta classe parece simples SimpleDateFormatter, mas suporta mais formatos. Além disso, se esse padrão fosse aplicado por engano pelo SimpleDateFormetter comum, o resultado seria formatado incorretamente, mas ainda legível.
fonte
Muitos dos exemplos aqui não funcionarão para 11, 12, 13. Isso é mais genérico e funcionará para todos os casos.
fonte
Não estou satisfeito com as respostas que exigem uma solução somente em inglês com base em formatos manuais. Estou procurando uma solução adequada há um tempo e finalmente a encontrei.
Você deve estar usando RuleBasedNumberFormat . Funciona perfeitamente e respeita a localidade.
fonte
Existe uma maneira mais simples e segura de fazer isso. A função que você precisará usar é getDateFromDateString (dateString); Ele basicamente remove o st / nd / rd / th de uma string de data e simplesmente o analisa. Você pode alterar seu SimpleDateFormat para qualquer coisa e isso funcionará.
}
fonte
O único problema da solução fornecida por Greg é que ela não é responsável por números maiores que 100, com os números "adolescentes" terminando. Por exemplo, 111 deve ser 111, não 111. Esta é a minha solução:
fonte
th
para 11, 12 e 13 como deveria. Acredito que oif ( hunRem - tenRem == 10 )
caso garanta que sim.RuleBasedNumberFormat
na biblioteca da UTIApreciei o link para a biblioteca do projeto da UTI de @ Pierre-Olivier Dybman ( http://www.icu-project.org/apiref/icu4j/com/ibm/icu/text/RuleBasedNumberFormat.html ), mas ainda precisava descobrir como usá-lo, então um exemplo do
RuleBasedNumberFormat
uso está abaixo.Ele formatará apenas um número e não a data inteira, portanto, você precisará criar uma sequência combinada se procurar uma data no formato: segunda-feira, 3 de fevereiro, por exemplo.
O código abaixo configura o
RuleBasedNumberFormat
formato como ordinal para um determinado local, cria umjava.time ZonedDateTime
e formata o número com seu ordinal em uma seqüência de caracteres.Exemplo de saída:
Ou
etc.
fonte
Aqui está uma abordagem que atualiza um padrão DateTimeFormatter com o literal correto do sufixo se encontrar o padrão
d'00'
, por exemplo, para o dia do mês 1, ele seria substituído pord'st'
. Depois que o padrão é atualizado, ele pode apenas ser alimentado no DateTimeFormatter para fazer o resto.Requer que o padrão original seja atualizado imediatamente antes de cada chamada de formatação, por exemplo
Portanto, isso é útil se o padrão de formatação for definido fora do código Java, por exemplo, um modelo, onde, como se você pudesse definir o padrão em Java, a resposta seria @ OleV.V. pode ser mais apropriado
fonte
Eu escrevi para mim mesmo um método auxiliar para obter padrões para isso.
e então podemos chamá-lo como
a saída é
fonte
Tente abaixo da função:
fonte
Date
,Calendar
eSimpleDateFormat
. Essas classes são mal planejadas e desatualizadas, a última em particular notoriamente problemática. Em vez disso, useLocalDate
eDateTimeFormatter
, ambos de java.time, a moderna API de data e hora de Java . Também estou em dúvida de que nova sua resposta contribui em comparação com as outras 18 respostas?No kotlin você pode usar assim
definido assim
fonte
O método a seguir pode ser usado para obter a seqüência de caracteres formatada da data que é passada para ele. Ele formatará a data para dizer 1º, 2º, 3º, 4º .. usando SimpleDateFormat em Java. Por exemplo: - 1 de setembro de 2015
fonte
A seguir, é uma resposta mais eficiente à pergunta, em vez de codificar o estilo.
Para alterar o dia para o número ordinal, você precisa usar o seguinte sufixo .
Encontre minha resposta completa nesta pergunta.
fonte
fonte