月の名前を文字列として返そうとしています。たとえば、「May」、「September」、「November」などです。
私は試した:
int month = c.get(Calendar.MONTH);
ただし、これは整数(それぞれ、5、9、11)を返します。月の名前を取得するにはどうすればよいですか?
回答:
以前のAPIの使用について String.format(Locale.US,"%tB",c);
java.util.Calendar
他のCalendar
クラスではなく、使用していますよね?
Formatter f = new Formatter();
(オプションでロケールを指定できます)thenString 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
、ロシア語で1月の「MMMM」パターンを使用すると、これが得られますLocale
。
января(完全な日付文字列に対して正しい: " 10января、2014 ")
ただし、スタンドアロンの月名の場合は、次のようになります。
январь
正しい解決策は次のとおりです。
SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() );
dateFormat.format( date );
すべての翻訳がどこから来ているかに興味がある場合は、グレゴリオ暦の翻訳(ページの上部にリンクされている他のカレンダー)への参照があります。
これと同じくらい簡単
mCalendar = Calendar.getInstance();
String month = mCalendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
Calendar.LONGは月のフルネームを取得し、Calendar.SHORTは略して名前を取得します。例:Calendar.LONGは1月を返しますCalendar.SHORTは1月を返します
私は他の場合に役立つこの答えを保持しますが、@ truthealityの答えは最も単純で直接的な方法のようです。
DateFormatSymbolsを使用できます
DateFormatSymbols(Locale.FRENCH).getMonths()[month]; // FRENCH as an example
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月の出力はМайですが、Маяではありません
ロシア。
Month
.MAY
.getDisplayName(
TextStyle.FULL_STANDALONE ,
new Locale( "ru" , "RU" )
)
5月
アメリカでは英語。
Month
.MAY
.getDisplayName(
TextStyle.FULL_STANDALONE ,
Locale.US
)
五月
これが現代の答えです。この質問が2011年に行われたとき、Calendar
とGregorianCalendar
、彼らは常に悪い設計されていたにも関わらず、一般的に、日付と時刻のために使用されました。それは8年前のことであり、それらのクラスは古くからあります。APIレベル26にまだ達していない場合、私の提案は、最新のJava日付と時刻APIであるjava.timeのAndroidに適合したバックポートを含むThreeTenABPライブラリを使用することです。java.timeは、操作するのに非常に優れています。
正確なニーズと状況に応じて、2つのオプションがあります。
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
。2つのうちどちらがコンテキストに適合するかを確認し、ユーザーに確認する必要があります。
時刻の有無にかかわらず日付がある場合は、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
クラスに最も近い代替品である、の使用を示しています。上記のコードは、のために働くだろうLocalDate
、LocalDateTime
、MonthDay
、OffsetDateTime
およびAYearMonth
あまりにも。
Calendar
まだjava.timeにアップグレードされていないレガシーAPIからを取得した場合はどうなりますか?aに変換し、ZonedDateTime
上記のように進めます。
Calendar c = getCalendarFromLegacyApi();
ZonedDateTime dateTime = DateTimeUtils.toZonedDateTime(c);
残りは以前と同じです。
java.timeは、古いAndroidデバイスと新しいAndroidデバイスの両方でうまく機能します。少なくともJava6が必要です。
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
スタンドアロンの月名を取得することは、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;
}
文字列で月の名前を取得します。
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プロジェクトに。一緒に仕事をするのはとてもいいです。