如何将整数转换为Java中的本地化月份名称?

我得到一个整数,我需要转换为不同的区域设置的月份名称:

locale en-us的示例:
1 – > 1月
2 – > 2月

区域设置es-mx的示例:
1 – > Enero
2 – > Febrero

import java.text.DateFormatSymbols; public String getMonth(int month) { return new DateFormatSymbols().getMonths()[month-1]; } 

您需要使用LLLL作为独立的月份名称。 这在SimpleDateFormat文档中有logging,例如:

 SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() ); dateFormat.format( date ); 

我会使用SimpleDateFormat。 有人纠正我,如果有一个更简单的方法来做一个monthed日历虽然,我现在做这个代码,我不太确定。

 import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; public String formatMonth(int month, Locale locale) { DateFormat formatter = new SimpleDateFormat("MMMM", locale); GregorianCalendar calendar = new GregorianCalendar(); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.MONTH, month-1); return formatter.format(calendar.getTime()); } 

这是我该怎么做的。 我将在整个int month离开范围检查。

 import java.text.DateFormatSymbols; public String formatMonth(int month, Locale locale) { DateFormatSymbols symbols = new DateFormatSymbols(locale); String[] monthNames = symbols.getMonths(); return monthNames[month - 1]; } 

使用SimpleDateFormat。

 import java.text.SimpleDateFormat; public String formatMonth(String month) { SimpleDateFormat monthParse = new SimpleDateFormat("MM"); SimpleDateFormat monthDisplay = new SimpleDateFormat("MMMM"); return monthDisplay.format(monthParse.parse(month)); } formatMonth("2"); 

结果:二月

显然在Android 2.2中有一个SimpleDateFormat的错误。

为了使用月份名称,您必须在您的资源中自行定义它们:

 <string-array name="month_names"> <item>January</item> <item>February</item> <item>March</item> <item>April</item> <item>May</item> <item>June</item> <item>July</item> <item>August</item> <item>September</item> <item>October</item> <item>November</item> <item>December</item> </string-array> 

然后在你的代码中使用它们:

 /** * Get the month name of a Date. eg January for the Date 2011-01-01 * * @param date * @return eg "January" */ public static String getMonthName(Context context, Date date) { /* * Android 2.2 has a bug in SimpleDateFormat. Can't use "MMMM" for * getting the Month name for the given Locale. Thus relying on own * values from string resources */ String result = ""; Calendar cal = Calendar.getInstance(); cal.setTime(date); int month = cal.get(Calendar.MONTH); try { result = context.getResources().getStringArray(R.array.month_names)[month]; } catch (ArrayIndexOutOfBoundsException e) { result = Integer.toString(month); } return result; } 

从Java 1.8(或JSR-310回送 1.7)开始,你可以使用这个:

 Month.of(integerMonth).getDisplayName(TextStyle.FULL_STANDALONE, locale); 

请注意, integerMonth是基于1的,即1表示1月份。 范围始终是从1到12(即只有公历)。

TL;博士

 Month.of( yourMonthNumber ) .getDisplayName( TextStyle.SHORT_STANDALONE , new Locale( "es" , "MX" ) ) 

java.time.Month

取代这些麻烦的旧的遗留date – 时间类的java.time类现在更容易做到了。

Month枚举定义了十二个对象,每个月一个。

1 – 12月的月份数为1-12。

 Month month = Month.of( 2 ); // 2 → February. 

请求对象生成一个月份名称的string,自动本地化 。

调整TextStyle以指定多久或缩短您想要的名称。 请注意,在某些语言(不是英语)中,如果单独使用或作为完整date的一部分使用,则月份名称会有所不同。 所以每个文本样式都有一个…_STANDALONE变体。

指定一个Locale来确定:

  • 在翻译中应该使用哪种语言。
  • 什么文化规范应该决定缩写,标点和大写等问题。

例:

 Locale l = new Locale( "es" , "MX" ); String output = Month.FEBRUARY.getDisplayName( TextStyle.SHORT_STANDALONE , l ); // Or Locale.US, Locale.CANADA_FRENCH. 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧date时间类,如java.util.Date.Calendarjava.text.SimpleDateFormat

Joda-Time项目现在处于维护模式 ,build议迁移到java.time。

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。

大部分的java.timefunction在ThreeTen-Backport中移植到Java 6&7中,并进一步适用于ThreeTenABP中的 Android (请参阅如何使用… )。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter等等。

当您使用DateFormatSymbols类的getMonthName方法在某些Android设备上获取按月份显示Month By Number时,会出现问题。 我通过这样做解决了这个问题:

在String_array.xml中

 <string-array name="year_month_name"> <item>January</item> <item>February</item> <item>March</item> <item>April</item> <item>May</item> <item>June</item> <item>July</item> <item>August</item> <item>September</item> <item>October</item> <item>November</item> <item>December</item> </string-array> 

在Java类中,像这样调用这个数组:

 public String[] getYearMonthName() { return getResources().getStringArray(R.array.year_month_names); //or like //return cntx.getResources().getStringArray(R.array.month_names); } String[] months = getYearMonthName(); if (i < months.length) { monthShow.setMonthName(months[i] + " " + year); } 

快乐编码:)

  public static void main(String[] args) { SimpleDateFormat format = new SimpleDateFormat("MMMMM", new Locale("en", "US")); System.out.println(format.format(new Date())); }