2011-10-16 3 views
2

는 다음 코드를 생각해주는java.util.Date 잘못 월

..... 년 = 2011, MONTH = 11, WEEK_OF_YEAR = 43, WEEK_OF_MONTH = 4, DAY_OF_MONTH = 14, DAY_OF_YEAR = 289, DAY_OF_WEEK = 1, DAY_OF_WEEK_IN_MONTH = 3, AM_PM = 0, HOUR = 11, HOUR_OF_DAY = 11, MINUTE = 32, SECOND = 51 , MILLISECOND = 117, ZONE_OFFSET = -18000000, DST_OFFSET = 3600000]

이는 Calendare 개체가 올바른 날짜를 보유하고 있음을 보여줍니다. 그러나 SQL 날짜로 변환하고 데이터베이스 (MySQL을 통해 JDBC)에 저장하면 MySQL 테이블에 '2011-11-14'대신 '2011-12-14'가 표시됩니다. 로케일과 시간대가 의심 스럽지만 시간의 월 부분이 아닌 시간대에 불일치가 발생합니다.

내가 뭘 잘못했는지에 대한 단서가 있습니까?

답변

5

Calendar#set(int, int, int)은 월 인수를 0부터 해석하므로 futureDate.set(2011, 11, 14)은 달력의 월을 12 월로 설정합니다.

+0

의도 된 상수를 사용하십시오. futureDate.set (2011, Calendar.DECEMBER, 14) – mhaller

+0

감사합니다. 그게 틀림 없어. 값이 입력 필드에서 왔기 때문에 Calendar.NOVEMBER를 사용할 수 없지만 지금은 이제 0 기준 월 값을 조정합니다. – adaj21

0

TL; DR은

LocalDate.of(2011 , 11 , 14) // November 14th, 2011 

세부

매트 공에 의해 대답은 올바른 것입니다. 그러나 이제는 훨씬 개선 된 방법이 있습니다. java.time 클래스에 의해 대체 지금 레거시있는 등 Calendar, java.util.Datejava.sql.Date

java.time

성가신 오래된 날짜 - 시간 수업. 기존 클래스와는 달리

는 java.time 클래스는 같은 달 월요일 ~ 일요일 12 월, 그리고 1-7 월에 1-12 번호 것으로을, 번호 제정신이있다.

LocalDate 클래스는 time-of-day 및 시간대가없는 날짜 전용 값을 나타냅니다.

LocalDate ld = LocalDate.of(2011 , 11 , 14) ; 

또는 편리한 Month enum을 사용하십시오.

LocalDate ld = LocalDate.of(2011 , Month.NOVEMBER , 14) ; 

JDBC 4.2 이상을 지원하는 JDBC 드라이버를 사용하면 java.time 객체를 데이터베이스에 직접 전달할 수 있습니다.

myPreparedStatement.setObject(… , ld) ; 

가져올 때 getObject을 사용하십시오. java.time

소개

LocalDate ld = myResultSet.getObject(… , LocalDate.class) ; 

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

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

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

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

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

관련 문제