月名称作为字符串


89

我正在尝试以字符串形式返回月份的名称,例如“ May”,“ September”,“ November”。

我试过了:

int month = c.get(Calendar.MONTH);

但是,这将返回整数(分别为5、9、11)。如何获得月份名称?

Answers:


88

使用getDisplayName

供较早的API使用 String.format(Locale.US,"%tB",c);


我遇到一个问题:getDisplayName(month,Calendar.LONG,Locale.US)而且Eclipse告诉我Calendar.LONG或Calendar.SHORT不存在。
加比

真奇怪 您正在使用java.util.Calendar而不是其他Calendar课程,对吗?
真实性2011年

是。看起来像getDisplayName()以及关联的Calendar.LONG和Calendar.SHORT仅是API级别9。因此,它适用于9级,但我需要7级:(
Gaby

3
Formatter f = new Formatter();(可选,您可以给它一个语言环境)然后String monthName = f.format("%tB",c).toString();%tb简称。
真实性2011年

5
也可以使用Locale.getDefault()代替Locale.US :)
闪耀

159

用这个 :

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());

13
对于第一种情况,“ MMMM”就足够了。
扬琴科2012年

114

要获取字符串变量中的月份,请使用以下代码

例如,9月:

M-> 9

MM-> 09

MMM-> 9月

MMMM-> 9月

String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())

1
是的,谢谢,它像一种魅力一样工作,在我使用的所有语言中(法语,英语,德语)
Chrysotribax

45

“ MMMM”绝对不是正确的解决方案(即使它适用于多种语言),请使用“ LLLL”模式 SimpleDateFormat

对独立月份名称的ICU兼容扩展名“ L”的支持已于20106月添加到Android平台。

即使用英语在“ MMMM”和“ LLLL”的编码之间没有区别,您也应该考虑其他语言。

例如,如果您使用Calendar.getDisplayName俄语,则使用一月份的“ MMMM”模式Locale

января(正确的完整日期字符串:“ 10января,2014 ”)

但是如果使用独立的月份名称,您将期望:

январь

正确的解决方案是:

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

如果您对所有翻译的来源感兴趣-这里是公历翻译的参考(其他日历链接在页面顶部)。


“ LLLL”仅从Java 8开始可用,您可以将“ MMMM”与SimpleDateFormat一起使用,并且对于独立版本也非常适用。
juanheyns 2015年

23

就这么简单

mCalendar = Calendar.getInstance();    
String month = mCalendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());

Calendar.LONG用于获取月份的全名,而Calendar.SHORT则简短地给出名称。例如:Calendar.LONG将返回一月Calendar.SHORT将返回一月


好答案。我自己设置日历以提醒注意,以后需要获取月份名称。完美answer.Thank你
Ajji

10

我保留此答案,这对其他情况很有用,但是@trutheality答案似乎是最简单直接的方法。

您可以使用DateFormatSymbols

DateFormatSymbols(Locale.FRENCH).getMonths()[month]; // FRENCH as an example

5

在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测试

输出五月Май但不Мая


3

俄语。

Month
.MAY
.getDisplayName(
    TextStyle.FULL_STANDALONE ,
    new Locale( "ru" , "RU" )
)

май

美国的英语。

Month
.MAY
.getDisplayName(
    TextStyle.FULL_STANDALONE ,
    Locale.US
)

可能

看到此代码在IdeOne.com上实时运行

ThreeTenABP和java.time

这是现代的答案。当这个问题被问在2011年,CalendarGregorianCalendar被普遍使用的日期和时间,即使他们总是设计不当。那是八年前了,那些课程早已过时了。假设您尚未达到API级别26,我的建议是使用ThreeTenABP库,该库包含Android改编的java.time反向端口,即现代Java日期和时间API。java.time更好用。

根据您的确切需求和情况,有两种选择:

  1. 使用Month及其getDisplayName方法。
  2. 使用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比较实用。例如:

    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,一个LocalDateTimeMonthDayOffsetDateTimeYearMonth也。

如果您Calendar从尚未升级到java.time的旧版API获得该怎么办?转换为aZonedDateTime并按上述步骤进行:

    Calendar c = getCalendarFromLegacyApi();
    ZonedDateTime dateTime = DateTimeUtils.toZonedDateTime(c);

其余与以前相同。

问题:java.time是否不需要Android API级别26?

java.time在旧的和较新的Android设备上均可正常运行。它至少需要Java 6

  • 在Java 8和更高版本以及更新的Android设备(来自API级别26)中,内置了现代API。
  • 在非Android Java 6和7中,获取ThreeTen Backport,这是现代类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在旧版Android上,请使用Android版本的ThreeTen Backport。它称为ThreeTenABP。并确保您导入org.threeten.bp带有子包的日期和时间类。

链接


2

我建议使用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


2

使用此格式“ 2018 Nov 01 16:18:22”获取日期和时间的示例方法

DateFormat dateFormat = new SimpleDateFormat("yyyy MMM dd HH:mm:ss");
        Date date = new Date();
         dateFormat.format(date);

0

要在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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.