A implementação de DateFormatSymbols foi alterada no JDK 8, então o método getMonths não retorna mais os valores corretos para todos os Locale's: oracle.com/technetwork/java/javase/…
ahaaman de
1
você poderia fornecer uma solução alternativa / funcional para o JDK8?
Dominik
quando você obteria um mês como um número?
Mickey Perlstein
Mickey para responder à sua pergunta, aqui está como você pega o mês como int e o usa - public static void main (String [] args) {int mês; GregorianCalendar data = novo GregorianCalendar (); mês = date.get (Calendar.MONTH); System.out.println ("O mês atual é" + (mês + 1) + "e o nome do mês é" + getMonthForInt (mês)); } static String getMonthForInt (int num) {String mês = "errado"; DateFormatSymbols dfs = new DateFormatSymbols (); String [] meses = dfs.getMonths (); if (num> = 0 && num <= 11) {mês = meses [num]; } mês de retorno; }
O uso da abstração do Calendário é a solução mais elegante na minha opinião. +1
sebastian
2
Errado! O problema estará em idiomas com caixas. Por exemplo, em localidades eslavas, ele retornará mês em caso genitivo, por exemplo, para outubro em localidade ru-RU você receberá em октябряvez de Октябрь, o que você provavelmente espera.
Nick Sikrier
41
Esta é a solução que encontrei para um projeto de classe:
Isso é útil para mimnew SimpleDateFormat("MMMM").format(cal.getTime());
Pratik Butani
esta é uma solução fraca, que tal janeiro, fevereiro etc. não além de janeiro, fevereiro etc. isso não cobrirá toda a situação
Abeer zaroor
2
Bem, você deve adicionar 1 ao mês. As matrizes começam em 0.
RoccoDev
isso é ruim, você está reinventando o java?
Mickey Perlstein
1
Isso funciona para usuários que falam inglês. E quanto aos outros?
Advait S
33
se você tiver uma interface multilíngue, poderá usar getDisplayName para exibir o nome do mês com controle do idioma de exibição.
aqui está um exemplo de exibição do nome do mês em inglês, francês, árabe e árabe em um país específico, como "Síria":
Calendar c =Calendar.getInstance();System.out.println(c.getDisplayName(Calendar.MONTH,Calendar.LONG,Locale.ENGLISH ));System.out.println(c.getDisplayName(Calendar.MONTH,Calendar.LONG,Locale.FRANCE ));System.out.println(c.getDisplayName(Calendar.MONTH,Calendar.LONG,newLocale("ar")));System.out.println(c.getDisplayName(Calendar.MONTH,Calendar.LONG,newLocale("ar","SY")));System.out.println(c.getTime().toString());
o resultado é:
January
janvier
ينايركانونالثانيSatJan1719:31:30 EET 2015
É uma resposta correta para a localidade RU. Muito estranho que o Android SDK não contenha especificações 'LLLL'.
Anfet
12
Joda-Time
Que tal usar o Joda-Time . É uma API de data e hora muito melhor para trabalhar (e Januarysignifica janeiro aqui. Não é como o Agenda, que usa0-based índice por meses).
monthNumberEsteja ciente de que você começa a contar a partir de 1 enquanto qualquer um dos métodos acima retorna uma matriz, então você precisa começar a contar a partir de 0.
não Monthinicia seu índice com janeiro = 1, enquanto o Calendário começa com janeiro = 0? Não Month.of(calendar.get(Calendar.MONTH));falharia no caso de janeiro?
MCO
2
Você pode obter uma linha como esta:
String monthName = new DataFormatSymbols.getMonths()[cal.get(Calendar.MONTH)]
Criei uma extensão kotlin com base nas respostas deste tópico e, usando as respostas DateFormatSymbols, você obtém uma resposta localizada.
fun Date.toCalendar():Calendar{
val calendar =Calendar.getInstance()
calendar.time =thisreturn calendar
}
fun Date.getMonthName():String{
val month = toCalendar()[Calendar.MONTH]
val dfs =DateFormatSymbols()
val months = dfs.months
return months[month]}
Embora sua resposta possa estar correta, ela é de má qualidade. Explique por que essa resposta está correta.
SubliemeSiem,
1
@SubliemeSiem Estou apenas tentando mudar o formato e a maneira mais simples de fazer isso: MM- retornará o nome do mês em um inteiro como 01, 02, 03. MMM-retornará o nome do mês abreviado como jan, fev, mar. MMMM-ele retornará o nome completo do mês em formato de string como janeiro.
Amit Mishra,
esta é a única resposta CORRETA para a formatação de datas. use um objeto Date ou Calendar e formate-o com um formatador. a pergunta em si é RUIM
Mickey Perlstein
0
Ele retorna o nome do mês em inglês. 04 retorna APRIL e assim por diante.
Sugestão simples e direta, obrigado. Seu código não compila. Você terá que declarar o tipo de retorno Monthou aplicar toStringao resultado antes de devolvê-lo.
Ole VV
-3
do documento Java SimpleDateFormat:
*<td><code>"yyyyy.MMMMM.dd GGG hh:mm aaa"</code>*<td><code>02001.July.04 AD 12:08 PM</code>*<td><code>"EEE, d MMM yyyy HH:mm:ss Z"</code>*<td><code>Wed,4Jul200112:08:56-0700</code>
Respostas:
Você também vai conseguir assim.
fonte
você pode obtê- lo usando SimpleDateFormat , que visa formatar datas e horas.
fonte
Tão simples quanto isso
fonte
октября
vez deОктябрь
, o que você provavelmente espera.Esta é a solução que encontrei para um projeto de classe:
O número que você passa vem de uma
Calendar.MONTH
chamada.fonte
new SimpleDateFormat("MMMM").format(cal.getTime());
se você tiver uma interface multilíngue, poderá usar getDisplayName para exibir o nome do mês com controle do idioma de exibição.
aqui está um exemplo de exibição do nome do mês em inglês, francês, árabe e árabe em um país específico, como "Síria":
o resultado é:
fonte
Para alguns idiomas (por exemplo, russo), esta é a única maneira correta de obter os nomes dos meses independentes.
Isso é o que você obtém, se usar
getDisplayName
doCalendar
ouDateFormatSymbols
para janeiro:января (que é correto para uma string de data completa: " 10 января, 2014 ")
mas no caso de um nome de mês independente, você esperaria:
январь
fonte
Joda-Time
Que tal usar o Joda-Time . É uma API de data e hora muito melhor para trabalhar (e
January
significa janeiro aqui. Não é como o Agenda, que usa0-based
índice por meses).Você pode usar o
AbstractDateTime#toString( pattern )
método para formatar a data no formato especificado:Nome do mês a partir do número
Se quiser o nome do mês para um determinado número de mês, você pode fazer assim:
Localizar
A abordagem acima usa o Locale padrão atual da JVM para o idioma do nome do mês. Em vez disso, você deseja especificar um objeto Locale.
fonte
SimpleDateFormat
eDate
Month::getDisplayName
Desde o Java 8, use o
Month
enum. OgetDisplayName
método localiza automaticamente o nome do mês.Passar:
TextStyle
para determinar por quanto tempo ou abreviações.Locale
para especificar a linguagem humana usada na tradução e as normas culturais usadas para abreviações, pontuação, etc.Exemplo:
fonte
Pode ser uma pergunta antiga, mas como uma linha para obter o nome do mês em que sabemos os índices, usei
ou para nomes curtos
monthNumber
Esteja ciente de que você começa a contar a partir de 1 enquanto qualquer um dos métodos acima retorna uma matriz, então você precisa começar a contar a partir de 0.fonte
Este código possui suporte a idiomas. Eu os usei no aplicativo Android.
fonte
Achei muito mais fácil ( https://docs.oracle.com/javase/tutorial/datetime/iso/enum.html )
fonte
Month
inicia seu índice com janeiro = 1, enquanto o Calendário começa com janeiro = 0? NãoMonth.of(calendar.get(Calendar.MONTH));
falharia no caso de janeiro?Você pode obter uma linha como esta:
String monthName = new DataFormatSymbols.getMonths()[cal.get(Calendar.MONTH)]
fonte
Isso funciona para mim:
Para retornar
"September"
com uma linha:fonte
Mão única:
Temos
Month
API em Java (java.time.Month
). Podemos usarMonth.of(month);
Aqui,
Month
são indexados como números, portanto, você pode fornecer porMonth.JANUARY
ou fornecer um índice na API acima, como 1, 2, 3, 4.Segunda forma:
Disponível em
java.time.ZonedDateTime
.fonte
Criei uma extensão kotlin com base nas respostas deste tópico e, usando as respostas DateFormatSymbols, você obtém uma resposta localizada.
fonte
Isso funcionou para mim
fonte
fonte
Ele retorna o nome do mês em inglês. 04 retorna APRIL e assim por diante.
fonte
Month
ou aplicartoString
ao resultado antes de devolvê-lo.do documento Java SimpleDateFormat:
fonte