文字列としての月名


89

月の名前を文字列として返そうとしています。たとえば、「May」、「September」、「November」などです。

私は試した:

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

ただし、これは整数(それぞれ、5、9、11)を返します。月の名前を取得するにはどうすればよいですか?

回答:


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();(オプションでロケールを指定できます)thenString monthName = f.format("%tB",c).toString();または%tb短い名前。
真実性2011年

5
また、代わりにLocale.USのLocale.getDefault()を使用して:)良いアイデアかもしれない
シャイン

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」で十分です。
yanchenko 2012年

114

文字列変数で月を取得するには、以下のコードを使用します

たとえば、9月:

M-> 9

MM-> 09

MMM-> 9月

MMMM-> 9月

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

1
はい、ありがとうございます。私が使用するすべての言語(フランス語、英語、ドイツ語)で、魅力のように機能します
Chrysotribax 2017

45

「MMMM」は間違いなく適切なソリューションではありません(多くの言語で機能する場合でも)。「LLLL」パターンを使用してください。 SimpleDateFormat

スタンドアロンの月名のICU互換拡張機能としての「L」のサポートが2010年6月にAndroidプラットフォームに追加されました。

英語では「MMMM」と「LLLL」のエンコーディングに違いはありませんが、他の言語についても考える必要があります。

たとえばCalendar.getDisplayName、ロシア語で1月の「MMMM」パターンを使用すると、これが得られますLocale

января(完全な日付文字列に対して正しい: " 10января、2014 ")

ただし、スタンドアロンの月名の場合は、次のようになります。

январь

正しい解決策は次のとおりです。

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

すべての翻訳がどこから来ているかに興味がある場合は、グレゴリオ暦の翻訳(ページの上部にリンクされている他のカレンダー)への参照があります。


'LLLL'はJava8以降でのみ使用可能であり、SimpleDateFormatで 'MMMM'を使用でき、スタンドアロンバージョンでも完全に正常に機能します。
juanheyns 2015年

23

これと同じくらい簡単

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

Calendar.LONGは月のフルネームを取得し、Calendar.SHORTは略して名前を取得します。例:Calendar.LONGは1月を返しますCalendar.SHORTは1月を返します


素晴らしい答え。私は自分でカレンダーをアラーム用に設定していて、後で月の名前を取得する必要がありました。パーフェクトは、あなたanswer.Thank
Ajji

10

私は他の場合に役立つこの答えを保持しますが、@ truthealityの答えは最も単純で直接的な方法のようです。

DateFormatSymbolsを使用できます

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

5

Androidで、ウクライナ語、ロシア語、チェコ語などの言語の適切にフォーマットされたスタナロン月の名前を取得する唯一の方法

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

API15-25でテスト済み

5月の出力はМайですが、Маяでありません


3

ロシア。

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

5月

アメリカでは英語。

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

五月

このコードはIdeOne.comでライブで実行されます

ThreeTenABPとjava.time

これが現代の答えです。この質問が2011年に行われたとき、CalendarGregorianCalendar、彼らは常に悪い設計されていたにも関わらず、一般的に、日付と時刻のために使用されました。それは8年前のことであり、それらのクラスは古くからあります。APIレベル26にまだ達していない場合、私の提案は、最新のJava日付と時刻APIであるjava.timeのAndroidに適合したバックポートを含むThreeTenABPライブラリを使用することです。java.timeは、操作するのに非常に優れています。

正確なニーズと状況に応じて、2つのオプションがあります。

  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.FULLTextStyle.FULL_STANDALONE。2つのうちどちらがコンテキストに適合するかを確認し、ユーザーに確認する必要があります。

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クラスに最も近い代替品である、の使用を示しています。上記のコードは、のために働くだろうLocalDateLocalDateTimeMonthDayOffsetDateTimeおよびAYearMonthあまりにも。

Calendarまだjava.timeにアップグレードされていないレガシーAPIからを取得した場合はどうなりますか?aに変換し、ZonedDateTime上記のように進めます。

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

残りは以前と同じです。

質問:java.timeはAndroid APIレベル26を必要としませんか?

java.timeは、古いAndroidデバイスと新しいAndroidデバイスの両方でうまく機能します。少なくともJava6が必要です。

  • Java 8以降および新しいAndroidデバイス(APIレベル26以降)では、最新のAPIが組み込まれています。
  • Android以外のJava6および7では、最新のクラスのバックポートであるThreeTenバックポートを取得します(JSR 310の場合はThreeTen。下部のリンクを参照してください)。
  • (古い)Androidでは、Android版のThreeTenBackportを使用します。それは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

この形式「2018Nov01 16:18:22」で日付と時刻を取得するサンプル方法は、これを使用します

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

0

スタンドアロンの月名を取得することは、Javaで「正しく」実行するのが驚くほど困難です。(少なくともこの記事の執筆時点では、現在Java 8を使用しています)。

問題は、ロシア語やチェコ語を含む一部の言語では、月の名前のスタンドアロンバージョンが「フォーマット」バージョンと異なることです。また、単一のJavaAPIが「最良の」文字列を提供するだけではないようです。これまでにここに投稿された回答の大部分は、フォーマットバージョンのみを提供しています。以下に貼り付けたのは、単一の月の名前のスタンドアロンバージョンを取得する、またはそれらすべてを含む配列を取得するための実用的なソリューションです。

これで他の人の時間を節約できることを願っています!

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

0

文字列で月の名前を取得します。

 private String getMonthName() {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat month_date = new SimpleDateFormat("MMMM");
    String month_name = month_date.format(cal.getTime());
    return month_name;
}

使用法:

String monthName = getMonthName();

長く時代遅れで悪名高い厄介なSimpleDateFormatクラスや友人を使用しないことを検討してください。あなたがいずれかを使用することができます参照してください脱糖をまたは追加ThreeTenABPを使用java.time、近代的なJavaの日付と時刻のAPIするために、あなたのAndroidプロジェクトに。一緒に仕事をするのはとてもいいです。
オレVV

ジョンが投票した上位の回答にまだ含まれていない多くの貢献をしていますか?
オレVV
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.