2009-12-31 10 views
2

1에서 12 사이의 정수를 해당 달 이름으로 프로그래밍 방식으로 변환하고 싶습니다. (예 : 1 -> 1 월, 2 -> 2 월) 등을 사용할 수 있습니다.Java에서 달 이름 가져 오기

참고 : 자바 캘린더 클래스 만 사용하고 싶습니다. 스위치 케이스 또는 문자열 배열 솔루션을 제안하지 마십시오.

감사합니다.

답변

7

Calendar 클래스는 하나의 명령문에서 현지화 된 월 이름을 얻는 데 사용할 수있는 최상의 클래스는 아닙니다.

// Month as a number. 
int month = 1; 

// Sets the Calendar instance to the desired month. 
// The "-1" takes into account that Calendar counts months 
// beginning from 0. 
Calendar c = Calendar.getInstance(); 
c.set(Calendar.MONTH, month - 1); 

// This is to avoid the problem of having a day that is greater than the maximum of the 
// month you set. c.getInstance() copies the whole current dateTime from system 
// including day, if you execute this on the 30th of any month and set the Month to 1 
// (February) getDisplayName will get you March as it automatically jumps to the next    
// Month 
c.set(Calendar.DAY_OF_MONTH, 1);  

// Returns a String of the month name in the current locale. 
c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault()); 

위의 코드는 한 달 반환 다음

(1 월 여기서 1) 만 Calendar 클래스를 사용 int 값으로 지정된 소망 한달 한달 이름을 얻는 예이다 이름은 시스템 로케일에 있습니다.

다른 로캘이 필요한 경우 을 Locale.US과 같은 특정 로캘로 바꿔 다른 Locale을 지정할 수 있습니다.

+0

하나의 진술에 있지만, 이것은 나를 위해 충분한 답변입니다! 감사! –

+0

실제로 getDisplayNames() 메소드를 살펴 보았습니다. Map 를 반환하는 이유는 무엇입니까? Map 은 적절한 Integer 값을 가진 달에 액세스 할 수 있으므로 더 논리적이라고 생각합니다. 정수 값을 얻기 위해 월 이름으로 Map에 액세스해야한다는 요구 사항을 볼 수 없습니다. 나는 당신이 그 달을 얻는 데 사용할 최고의 수업이 아니라고 말할 때 그것이 무엇을 의미하는지 생각합니다. – camickr

+0

@camickr :'getDisplayNames' 메쏘드는 다른 클래스를 추가 한 새로운 유스 케이스를 지원하기 위해'Calendar' 클래스에 추가 된 것처럼 보입니다. 그 클래스의 많은 부분처럼 보이는'DateFormatSymbols'을 의심하고 JDK 1.6에 앞서 언급 한 메서드가 추가되었습니다. – coobird

3

사용 DateFormatSymbols

자랑스럽게 bluebones.net에서 복사 및 붙여 넣기 :

import java.text.*; 

String getMonthForInt(int m) { 
    String month = "invalid"; 
    DateFormatSymbols dfs = new DateFormatSymbols(); 
    String[] months = dfs.getMonths(); 
    if (m >= 0 && m <= 11) { 
     month = months[m]; 
    } 
    return month; 
} 
+0

캘린더를 사용하면 질문에 표시됩니다. –

+0

그런 다음 getDisplayName을 사용하면 camickr가 나타납니다. – Anurag

+0

coolbird에서 대답을 얻었습니다. 당신의 해결책도 좋습니다! 조금 수정 한 경우, 한 문장의 요구 사항을 충족합니다.:) –

2

당신이 API를 읽나요? getDisplayName (...) 메소드는 시작하기 좋은 곳처럼 보입니다. 한 문장으로 처리하는 것은 끔찍한 요구 사항입니다.

0

TL; DR

Month.of(12).getDisplayName(TextStyle.FULL , Locale.US) 

... 나 ...

Month.DECEMBER.getDisplayName(TextStyle.FULL , Locale.US) 

12 월 지역화 된 이름을 가져 java.time

현대적인 방법을 사용하여

미주리 n 번째 열은 java.time.Month 열거 형입니다. 이 클래스는 현재 DateCalendar과 같이 문제가있는 오래된 레거시 날짜 - 시간 클래스를 대신하는 java.time 패키지의 일부입니다.

지정, 현지화 :

  • TextStyle 문자열이 있어야 할 시간 또는 약식 결정.
  • Locale (a) 이름, 월 이름 등의 번역을위한 인간 언어 및 (b) 약어, 대문자, 구두점, 분리 기호 등의 문제를 결정하는 문화적 규범을 결정할 수 있습니다.

예제 코드.

Month month = Month.of(7); 
String outputConstantName = month.toString(); 
String outputMonthNameEnglish = month.getDisplayName(TextStyle.FULL , Locale.US); 
String outputMonthQuébec = month.getDisplayName(TextStyle.FULL , Locale.CANADA_FRENCH); 

개월.toString() -7 월

outputMonthNameEnglish :

outputMonthQuébec 7월

는 : 읽기 쉽고 편리하게 할 수 있습니다 이름이 아닌 개월 수에 의해 Month 열거 객체를 사용

일 목, 덜 오류가 발생하기 쉬운. java.time

소개

String output = Month.JULY.getDisplayName(TextStyle.FULL , Locale.US) ; 

java.time 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 java.util.Date, Calendar, & SimpleDateFormat과 같이 문제가있는 이전 legacy 날짜 - 시간 클래스를 대체합니다.

maintenance mode에있는 Joda-Time 프로젝트는 java.time 클래스로의 마이그레이션을 권장합니다.

자세히 알아 보려면 Oracle Tutorial을 참조하십시오. 그리고 많은 예제와 설명을 위해 스택 오버플로를 검색하십시오. 사양은 JSR 310입니다.

어디에서 java.time 클래스를 얻을 수 있습니까?

  • Java SE 8SE 9 이후
    • 내장한다.
    • 번들로 구현 된 표준 Java API의 일부입니다.
    • Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되었습니다.
  • Java SE 6 및 java.time 기능의 대부분
  • Android

ThreeTen-Extra 프로젝트는 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 가능성을 입증합니다. 여기에 Interval, YearWeek, YearQuartermore과 같은 유용한 클래스가 있습니다.