예를 들어 "May", "September", "November"와 같이 달의 이름을 문자열로 반환하려고합니다.
나는 시도했다 :
int month = c.get(Calendar.MONTH);
그러나 이것은 정수 (각각 5, 9, 11)를 리턴합니다. 월 이름은 어떻게 알 수 있습니까?
답변:
getDisplayName을 사용하십시오 .
이전 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
를 들어 러시아어로 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은 January Calendar를 반환합니다 .SHORT는 Jan을 반환합니다.
다른 경우에 유용한이 답변을 유지하지만 @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);
}
API 15-25에서 테스트 됨
의 출력 월 입니다 Май 하지만 Мая
러시아인.
Month
.MAY
.getDisplayName(
TextStyle.FULL_STANDALONE ,
new Locale( "ru" , "RU" )
)
май
미국에서의 영어.
Month
.MAY
.getDisplayName(
TextStyle.FULL_STANDALONE ,
Locale.US
)
할 수있다
이 코드는 IdeOne.com에서 실시간으로 실행 됩니다.
여기에 현대적인 대답이 있습니다. 이 질문은 2011 년에 요청했다, 때 Calendar
와 GregorianCalendar
일반적으로 그들은 항상 가난하게 디자인되었다하더라도 날짜와 시간을 사용 하였다. 지금은 8 년 전이고 그 수업은 오래되었습니다. 아직 API 레벨 26이 아니라고 가정 할 때 Android에서 조정 한 java.time 백 포트, 최신 Java 날짜 및 시간 API가 포함 된 ThreeTenABP 라이브러리를 사용하는 것이 좋습니다. 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);
나는 ZonedDateTime
이전 Calendar
클래스 를 가장 가까운 대체물로 사용하고 있습니다. 위의 코드는 작동합니다 LocalDate
A, LocalDateTime
, MonthDay
, OffsetDateTime
및 YearMonth
도.
당신은이 있어요 경우 Calendar
아직 java.time로 업그레이드하지 레거시 API에서? a로 변환하고 ZonedDateTime
위와 같이 진행하십시오.
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
독립형 월 이름을 얻는 것은 자바에서 "올바르게"수행하기가 놀랍도록 어렵습니다. (적어도이 글을 쓰는 현재. 저는 현재 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;
}
String에서 월의 이름을 가져옵니다.
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
클래스와 친구들을 사용하지 않는 것을 고려하십시오 . 당신이 중 하나를 사용할 수 있는지 확인 desugaring를 하거나 추가 ThreeTenABP을 사용 java.time, 현대 자바 날짜와 시간 API하기 위해, 안드로이드 프로젝트에. 함께 작업하는 것이 훨씬 더 좋습니다.