java.util.Date для преобразования java.sql.Date дает неверный месяц - PullRequest
2 голосов
/ 16 октября 2011

Рассмотрим следующий фрагмент:

Calendar futureDate = Calendar.getInstance();
int year = 2011;
int month = 11;
int day = 14;
futureDate.set(year,month, day);
System.out.println(futureDate.toString());
java.sql.Date sqlDate  = new java.sql.Date( futureDate.getTime().getTime());

Распечатка из futureDate.toString ():

..... YEAR = 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, ЧАС = 11, HOUR_OF_DAY = 11, МИНУТНЫЙ = 32, ВТОРОЙ = 51, миллисекунды = 117, ZONE_OFFSET = -18000000, DST_OFFSET= 3600000]

, который показывает, что объект Calendare содержит правильную дату.Однако после преобразования в дату sql и сохранения в базе данных (MySQL через JDBC) в таблице MySQL для этой даты вместо «2011-11-14» отображается «2011-12-14».Я бы заподозрил локаль и часовой пояс, но это может привести к расхождению во времени дня, а не в месячной части даты.

Ответы [ 2 ]

5 голосов
/ 16 октября 2011

Calendar#set(int, int, int) интерпретирует аргумент месяца как основанный на нуле, поэтому futureDate.set(2011, 11, 14) устанавливает месяц календаря на декабрь.

0 голосов
/ 19 сентября 2017

tl; др

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

Подробности

Ответ от Мэтта Болла правильный.Но теперь есть намного улучшенный способ.

java.time

Мучительные старые классы даты и времени, такие как Calendar, java.util.Date и java.sql.Date, теперь унаследованы, замененыклассами java.time.

В отличие от устаревших классов, классы java.time имеют вменяемую нумерацию , например, месяцы с номерами 1-12 для января по декабрь и 1-7 для понедельника по воскресенье.

Класс LocalDate представляет значение только для даты без времени суток и без часового пояса.

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

Или используйте удобное перечисление Month.

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

Используя драйвер JDBC, поддерживающий JDBC 4.2 и более поздние версии, вы можете передавать свои объекты java.time непосредственно в базу данных..

myPreparedStatement.setObject( … , ld ) ;

При получении используйте getObject.

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

О java.time

java.time фреймворк встроен в Java 8 и выше.Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Где получить классы java.time?

Проект ThreeTen-Extra расширяет Java.время с дополнительными занятиями.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...