如何将整数转换为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
, .Calendar
和java.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一些有用的类,比如Interval
, YearWeek
, YearQuarter
等等。
当您使用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())); }