我正在尝试以字符串形式返回月份的名称,例如“ May”,“ September”,“ November”。
我试过了:
int month = c.get(Calendar.MONTH);
但是,这将返回整数(分别为5、9、11)。如何获得月份名称?
Answers:
供较早的API使用 String.format(Locale.US,"%tB",c);
java.util.Calendar
而不是其他Calendar
课程,对吗?
Formatter f = new Formatter();
(可选,您可以给它一个语言环境)然后String monthName = f.format("%tB",c).toString();
或%tb
简称。
用这个 :
Calendar cal=Calendar.getInstance();
SimpleDateFormat month_date = new SimpleDateFormat("MMMM");
String month_name = month_date.format(cal.getTime());
月名称将包含完整的月名称,如果要使用短月名称,请使用此名称
SimpleDateFormat month_date = new SimpleDateFormat("MMM");
String month_name = month_date.format(cal.getTime());
要获取字符串变量中的月份,请使用以下代码
例如,9月:
M-> 9
MM-> 09
MMM-> 9月
MMMM-> 9月
String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())
“ MMMM”绝对不是正确的解决方案(即使它适用于多种语言),请使用“ LLLL”模式 SimpleDateFormat
对独立月份名称的ICU兼容扩展名“ L”的支持已于2010年6月添加到Android平台。
即使用英语在“ MMMM”和“ LLLL”的编码之间没有区别,您也应该考虑其他语言。
例如,如果您使用Calendar.getDisplayName
俄语,则使用一月份的“ MMMM”模式Locale
:
января(正确的完整日期字符串:“ 10января,2014 ”)
但是如果使用独立的月份名称,您将期望:
январь
正确的解决方案是:
SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() );
dateFormat.format( date );
我保留此答案,这对其他情况很有用,但是@trutheality答案似乎是最简单直接的方法。
您可以使用DateFormatSymbols
DateFormatSymbols(Locale.FRENCH).getMonths()[month]; // FRENCH as an example
在Android上获取乌克兰,俄语,捷克语等语言的格式正确的stanalone月名称的唯一方法
private String getMonthName(Calendar calendar, boolean short) {
int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NO_MONTH_DAY | DateUtils.FORMAT_NO_YEAR;
if (short) {
flags |= DateUtils.FORMAT_ABBREV_MONTH;
}
return DateUtils.formatDateTime(getContext(), calendar.getTimeInMillis(), flags);
}
经过API 15-25测试
输出五月是Май但不Мая
俄语。
Month
.MAY
.getDisplayName(
TextStyle.FULL_STANDALONE ,
new Locale( "ru" , "RU" )
)
май
美国的英语。
Month
.MAY
.getDisplayName(
TextStyle.FULL_STANDALONE ,
Locale.US
)
可能
这是现代的答案。当这个问题被问在2011年,Calendar
和GregorianCalendar
被普遍使用的日期和时间,即使他们总是设计不当。那是八年前了,那些课程早已过时了。假设您尚未达到API级别26,我的建议是使用ThreeTenABP库,该库包含Android改编的java.time反向端口,即现代Java日期和时间API。java.time更好用。
根据您的确切需求和情况,有两种选择:
Month
及其getDisplayName
方法。DateTimeFormatter
。 Locale desiredLanguage = Locale.ENGLISH;
Month m = Month.MAY;
String monthName = m.getDisplayName(TextStyle.FULL, desiredLanguage);
System.out.println(monthName);
该代码段的输出为:
可能
使用几种语言,无论您使用TextStyle.FULL
还是TextStyle.FULL_STANDALONE
。您将不得不查看,或者与您的用户一起检查,这两者中的哪一个适合您的上下文。
如果您有约会,但没有时间,我觉得DateTimeFormatter
比较实用。例如:
DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MMMM", desiredLanguage);
ZonedDateTime dateTime = ZonedDateTime.of(2019, 5, 31, 23, 49, 51, 0, ZoneId.of("America/Araguaina"));
String monthName = dateTime.format(monthFormatter);
我正在展示a的使用,它ZonedDateTime
是旧Calendar
类的最接近的替代品。上面的代码将一个工作LocalDate
,一个LocalDateTime
,MonthDay
,OffsetDateTime
和YearMonth
也。
如果您Calendar
从尚未升级到java.time的旧版API获得该怎么办?转换为aZonedDateTime
并按上述步骤进行:
Calendar c = getCalendarFromLegacyApi();
ZonedDateTime dateTime = DateTimeUtils.toZonedDateTime(c);
其余与以前相同。
java.time在旧的和较新的Android设备上均可正常运行。它至少需要Java 6。
org.threeten.bp
带有子包的日期和时间类。java.time
首先在此处进行了描述。java.time
Java 6和7的反向移植(JSR-310的ThreeTen)。我建议使用Calendar
对象,并且Locale
由于不同的语言,月份名称是不同的:
// index can be 0 - 11
private String getMonthName(final int index, final Locale locale, final boolean shortName)
{
String format = "%tB";
if (shortName)
format = "%tb";
Calendar calendar = Calendar.getInstance(locale);
calendar.set(Calendar.MONTH, index);
calendar.set(Calendar.DAY_OF_MONTH, 1);
return String.format(locale, format, calendar);
}
完整月份名称的示例:
System.out.println(getMonthName(0, Locale.US, false));
结果: January
短月份名称示例:
System.out.println(getMonthName(0, Locale.US, true));
结果: Jan
使用此格式“ 2018 Nov 01 16:18:22”获取日期和时间的示例方法
DateFormat dateFormat = new SimpleDateFormat("yyyy MMM dd HH:mm:ss");
Date date = new Date();
dateFormat.format(date);
要在Java中执行“正确”操作,很难获得独立的月份名称。(至少在撰写本文时。我当前正在使用Java 8)。
问题在于,在某些语言(包括俄语和捷克语)中,月名称的独立版本与“格式”版本不同。另外,似乎没有任何Java API会给您“最佳”字符串。到目前为止,此处发布的大多数答案仅提供格式化版本。下面粘贴的是一个有效的解决方案,用于获取一个月名称的独立版本,或获取包含所有名称的数组。
我希望这可以节省一些时间!
/**
* getStandaloneMonthName, This returns a standalone month name for the specified month, in the
* specified locale. In some languages, including Russian and Czech, the standalone version of
* the month name is different from the version of the month name you would use as part of a
* full date. (Different from the formatting version).
*
* This tries to get the standalone version first. If no mapping is found for a standalone
* version (Presumably because the supplied language has no standalone version), then this will
* return the formatting version of the month name.
*/
private static String getStandaloneMonthName(Month month, Locale locale, boolean capitalize) {
// Attempt to get the standalone version of the month name.
String monthName = month.getDisplayName(TextStyle.FULL_STANDALONE, locale);
String monthNumber = "" + month.getValue();
// If no mapping was found, then get the formatting version of the month name.
if (monthName.equals(monthNumber)) {
DateFormatSymbols dateSymbols = DateFormatSymbols.getInstance(locale);
monthName = dateSymbols.getMonths()[month.getValue()];
}
// If needed, capitalize the month name.
if ((capitalize) && (monthName != null) && (monthName.length() > 0)) {
monthName = monthName.substring(0, 1).toUpperCase(locale) + monthName.substring(1);
}
return monthName;
}
/**
* getStandaloneMonthNames, This returns an array with the standalone version of the full month
* names.
*/
private static String[] getStandaloneMonthNames(Locale locale, boolean capitalize) {
Month[] monthEnums = Month.values();
ArrayList<String> monthNamesArrayList = new ArrayList<>();
for (Month monthEnum : monthEnums) {
monthNamesArrayList.add(getStandaloneMonthName(monthEnum, locale, capitalize));
}
// Convert the arraylist to a string array, and return the array.
String[] monthNames = monthNamesArrayList.toArray(new String[]{});
return monthNames;
}