月份名称为字符串

时间:2011-05-31 19:52:42

标签: android calendar

我正在尝试将月份名称作为字符串返回,例如“May”,“September”,“November”。

我试过了:

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

然而,这会返回整数(分别为5,9,11)。我怎样才能获得月份名称?

11 个答案:

答案 0 :(得分:143)

使用此:

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

答案 1 :(得分:90)

为了在字符串变量中获取月份,请使用以下代码

例如9月:

M - > 9

MM - > 09

MMM - >月

MMMM - >九月

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

答案 2 :(得分:83)

使用getDisplayName

对于早期API的使用String.format(Locale.US,"%tB",c);

答案 3 :(得分:37)

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

支持“L”作为独立月份名称的ICU兼容扩展程序已添加到Jun. 2010上的Android平台。

即使用英语,'MMMM'和'LLLL'的编码也没有区别,你也应该考虑其他语言。

E.g。这是你得到的,如果你使用Calendar.getDisplayName或1月的“MMMM”模式与俄语Locale

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

但是如果您想要一个独立的月份名称:

<强>январь

正确的解决方案是:

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

如果您对所有翻译的来源感兴趣 - here is the reference到格里高利历日历翻译(页面顶部链接的其他日历)。

答案 4 :(得分:15)

这很简单

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

答案 5 :(得分:9)

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

您可以使用DateFormatSymbols

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

答案 6 :(得分:3)

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

可能的输出Май,但不是Мая

答案 7 :(得分: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

答案 8 :(得分:2)

俄语。

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

май

美国英语。

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

五月

请参阅此code run live at IdeOne.com

ThreeTenABP和java.time

这是现代答案。在2011年提出此问题时,CalendarGregorianCalendar通常用于日期和时间,尽管它们的设计总是很差。那是8年前了,那些课程早已过时了。假设您尚未达到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);

我正在展示ZonedDateTime的用法,它是旧Calendar类的最接近的替代品。上面的代码也适用于LocalDateLocalDateTimeMonthDayOffsetDateTimeYearMonth

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

    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(ThreeTen for JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

链接

答案 9 :(得分:0)

获得一个独立的月份名称令人惊讶地难以执行&#34;对&#34;在Java中。 (至少在撰写本文时。我目前正在使用Java 8)。

问题是在某些语言中,包括俄语和捷克语,月份名称的独立版本与&#34;格式化&#34;不同。版。此外,似乎没有任何一个Java API能够为您提供最好的&#34;串。到目前为止,此处发布的大多数答案仅提供格式化版本。下面粘贴的是一个工作解决方案,用于获取单个月名称的独立版本,或获取包含所有这些名称的数组。

我希望这能节省一些时间!

/**
 * 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;
}

答案 10 :(得分:0)

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

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