Java : 날짜에서 월 정수 가져 오기


157

Date 객체 ( java.util.Date) 에서 월을 정수로 얻으려면 어떻게합니까 ?


23
실제로 날짜에 속하는 getMonth ()는 영원히 이후 사용되지 않습니다)
마테우스 Dymczyk에게

6
@slhck : 더 이상 사용되지 않습니다. JDK 버전 1.1부터는 Calendar.get (Calendar.MONTH)로 대체되었습니다.
adarshr

3
@ Zenzen 대부분 사용되지 않는 클래스에서 사용되지 않는 메소드를 사용할 때 문제가 발생하지 않습니다.
Serabe

1
@Muhd 당신이 데이트를하고 있다면, 스스로 도움을주고 joda 나 다른 도서관을 사용하십시오.
Serabe

1
@ Serabe : 문제는 더 나은 솔루션 (적어도 폐기되지 않은 솔루션)이 있다는 것입니다. 그리고 getMonth는 14 년 동안 더 이상 사용되지 않으며 어떤 이유로 더 이상 사용되지 않습니다.
Mateusz Dymczyk

답변:


57

java.time (자바 8)

Java 8에서 java.time 패키지 를 사용 하여 java.util.Date객체를 객체 로 변환 java.time.LocalDate한 다음 getMonthValue()메소드를 사용할 수도 있습니다.

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();

월 값은 cal.get(Calendar.MONTH)0에서 11 사이의 값을 제공하는 adarshr의 답변 과 달리 1에서 12 사이 입니다.

그러나 Basil Bourque가 의견에서 말했듯이 선호되는 방법은 메소드 로 Month열거 형 객체 를 얻는 LocalDate::getMonth것입니다.


1
좋은 대답입니다. 독자에 대한 참고 사항 : 답변에 표시된 기본값에 따라 통화에 의존하지 않고 시간대를 지정할 수 있습니다. 파리에서는 몬트리올보다 새로운 날이 시작됩니다. 특히 Montréal에 관심이 있으시면을 사용하십시오 ZoneId.of( "America/Montreal" ).
Basil Bourque


그건 그렇고, 독자에게 또 다른 참고 사항 : 단순한 정수가 아닌 Month열거 형 객체를 얻을 수도 있습니다 . 방법을 Month m = localDate.gotMonth();참조하십시오 LocalDate::getMonth. 이와 같은 객체를 사용하면 코드를 자체 문서화하고 형식 안전성을 보장하며 유효한 값을 보장 할 수 있습니다. Oracle의 Enum tutorial 을 참조하십시오 .
Basil Bourque

1
를 사용 date.toInstant()하고 java.sql.Date(의 자식 java.util.Date) 과 함께 일하는 경우을 얻습니다 UnsupportedOperationException. Trynew java.sql.Date(src.getTime()).toLocalDate()
Adam

1
@Adam java.sql.Date이전 클래스에 추가 된 새로운 변환 방법을 사용하여 훨씬 쉽게 변환 할 수 있습니다. java.sql.Date.valueOf( myLocalDate )그리고 myJavaSqlDate.toLocalDate() 또한, JDBC 드라이버는 JDBC 4.2 업데이트 이후 더 이상 필요하지 않은 java.sql유형을 할 수 있습니다 직접 주소 java.time유형 바이어 ResultSet::getObjectPreparedStatement::setObject방법.
Basil Bourque

287
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);

166
참고 Calendar.MONTH명백한 이유이다는 즉 1월 == 0, 0부터. 이제 API에 잘 설명되어 있지만 처음 사용자에게는 여전히 혼란 스럽습니다. : 어쩌면 시간을 새로운 SO 질문 나 자신을 위해 (/ I 두려워하지만 그 어떤 좋은 배경이없는) - 나는 그들이 그와 함께 갔다 이유를 말해 줄 수있는 사람이 찾아 아직했습니다
Voo

5
@Voo Date.getMonth () 메서드는 0을 기반으로 했으므로 Calendar.MONTH도 주된 이유 일 것입니다.
Muhd

1
@Muhd 물론 그것은 교체였습니다. 그러나 그것은 왜 Date.getMonth ()가 0을 기반으로했는지에 대한 질문을 바꿉니다. 끔찍한 디자인, 특히 날이 한 순간에 시작된 이모는 (적어도 일관성이있을 수 있습니다!) 나는 잘 디자인되지 않은 API (날짜와 달력 모두)에서 시작하는 것이 약간의 감독이라고 생각합니다. 그러나 아마도 선례가있을 수 있습니다. 그것은 나에게 이상하게 보이며 내 경험에서 두 명 이상의 초보자에게 문제를 일으켰습니다.
Voo

2
실제로 그것은 이미 여기에서 요청되었습니다 (뿐만 아니라). 결론은 잘못 설계된 API의 결과입니다. 당신이 언급 한대로 전체 Date 클래스는 농담입니다. 재미있는 사실은 Java 만이이 문제로 고통 받는다는 것입니다-iirc JavaScript의 날짜 getMonth ()도 0으로 시작합니다!
Mateusz Dymczyk

1
@Voo getYear()는 또한 "명백한 이유도없이"1900 년을 뺀 것입니다.
Hele

17

Java 8 날짜 API 를 사용하는 경우 한 줄로 직접 얻을 수 있습니다!

LocalDate today = LocalDate.now();
int month = today.getMonthValue();

7

조다 타임

또는 Joda-Time DateTime 클래스를 사용하십시오.

//convert date to datetime
DateTime datetime = new DateTime(date);
int month = Integer.parseInt(datetime.toString("MM"))

…또는…

int month = dateTime.getMonthOfYear();

2
더 간단하게는 DateTime객체의 월을 요청하십시오 . int month = dateTime.getMonthOfYear();
Basil Bourque

Basil에게 전화를 걸어 코드를 업데이트했습니다. 그러나 나는 .toString("MM")단지 "MM"보다 더 많은 가능성이 있음을 보여줍니다.
ssoward

1
이 답변은 시간대의 중요한 문제를 무시합니다. 질문 및 형제 답변에 대한 내 의견을 참조하십시오. DateTimeZone해당 DateTime 생성자에 객체를 전달하는 것이 좋습니다 DateTimeZone.forID( "America/Montreal" ).
Basil Bourque

6

tl; dr

myUtilDate.toInstant()                          // Convert from legacy class to modern. `Instant` is a point on the timeline in UTC.
          .atZone(                              // Adjust from UTC to a particular time zone to determine date. Renders a `ZonedDateTime` object. 
              ZoneId.of( "America/Montreal" )   // Better to specify desired/expected zone explicitly than rely implicitly on the JVM’s current default time zone.
          )                                     // Returns a `ZonedDateTime` object.
          .getMonthValue()                      // Extract a month number. Returns a `int` number.

java.time 세부

도움말 사용 Ortomala Lokni에 의해 java.time은 올바른 것입니다. 그리고 이전 java.util.Date/.Calendar 클래스보다 크게 개선 된 java.time 을 사용해야 합니다. java.time 의 Oracle Tutorial 을 참조하십시오 .

새로운 코드로 시작할 때 java.util.Date에 관계없이 java.time을 사용하는 방법을 보여주는 코드를 추가하겠습니다.

간단히 말해서 java.time 사용… An Instant은 타임 라인의 순간입니다 (UTC). 시간대 ( ZoneId)를 적용하여을 가져옵니다 ZonedDateTime.

Month수업은 일반적으로 한 달을 나타내는 정교한 열거 형 입니다. 그 열거 형은 현지화 된 이름을 얻는 것과 같은 편리한 방법을 가지고 있습니다. 그리고 java.time의 월 번호는 java.util.Date/.Calendar에있는 0부터 시작하는 넌센스 (0-11)가 아니라 1-12 인 제정신입니다.

현재 날짜-시간을 얻으려면 시간대 가 중요합니다. 언제든 날짜는 전 세계에서 동일 하지 않습니다 . 따라서 월말 / 시작일이 가까워지면 월이 전 세계에서 동일하지 않습니다.

ZoneId zoneId = ZoneId.of( "America/Montreal" );  // Or 'ZoneOffset.UTC'.
ZonedDateTime now = ZonedDateTime.now( zoneId );
Month month = now.getMonth(); 
int monthNumber = month.getValue(); // Answer to the Question.
String monthName = month.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );

java.time에 대하여

java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.

java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 .java.sql.*

java.time 클래스는 어디서 구할 수 있습니까?

ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .


4

Joda 시간을 사용할 수없고 여전히 어두운 세상에 살고 있다면 :) (Java 5 이하) 이것을 즐길 수 있습니다 :

참고 : 날짜가 모두 dd / MM / YYYY 형식으로되어 있는지 확인하십시오.

/**
Make an int Month from a date
*/
public static int getMonthInt(Date date) {

    SimpleDateFormat dateFormat = new SimpleDateFormat("MM");
    return Integer.parseInt(dateFormat.format(date));
}

/**
Make an int Year from a date
*/
public static int getYearInt(Date date) {

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
    return Integer.parseInt(dateFormat.format(date));
}

당신은 어머니입니다! / Είσαι η μάνα!
Tzegenos

0
Date mDate = new Date(System.currentTimeMillis());
mDate.getMonth() + 1

반환 된 값은 0부터 시작하므로 결과에 값을 추가해야합니다.


6
답에 대한 두 가지 문제 : 하나는 new Date()없이 수행함으로써 현재 시간으로 날짜를 만들 수 있다는 것 System.currentTimeMillis입니다. 다른 하나는 getMonth가 더 이상 사용되지 않는다는 것입니다.
Muhd

@Muhd 그렇다면 최고의 솔루션은 무엇입니까?
twlkyao

@Muhd 여기에 추가 한 System.currentTimeMillis ()는 여기에 긴 유형이며 날짜를 지정할 수 있음을 나타냅니다.
twlkyao

4
날짜 : 속하는 getMonth 이미 자바 1.1 (사용되지 않습니다 cs.mun.ca/~michael/java/jdk1.1-beta2-docs/api/... )
Ortomala Lokni
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.