Ответ 1
Месяцы основаны на нулевом значении в календаре. Таким образом, 12 интерпретируется как декабрь + 1 месяц. Используйте
c.set(year, month - 1, day, 0, 0);
int day = Integer.parseInt(request.getParameter("day")); // 25
int month = Integer.parseInt(request.getParameter("month")); // 12
int year = Integer.parseInt(request.getParameter("year")); // 1988
System.out.println(year);
Calendar c = Calendar.getInstance();
c.set(year, month, day, 0, 0);
b.setDob(c.getTime());
System.out.println(b.getDob());
Выход:
1988
Ср Янв 25 00:00:08 IST 1989
Я прохожу 25 12 1988
, но получаю 25 Jan 1989
. Почему?
Месяцы основаны на нулевом значении в календаре. Таким образом, 12 интерпретируется как декабрь + 1 месяц. Используйте
c.set(year, month - 1, day, 0, 0);
Это мой любимый путь до Java 8:
Date date = new GregorianCalendar(year, month - 1, day).getTime();
Я бы сказал, что это более чистый подход, чем:
calendar.set(year, month - 1, day, 0, 0);
Использование рамки java.time
, встроенной в Java 8
int year = 2015;
int month = 12;
int day = 22;
LocalDate.of(year, month, day); //2015-12-22
LocalDate.parse("2015-12-22"); //2015-12-22
//with custom formatter
DateTimeFormatter.ofPattern formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate.parse("22-12-2015", formatter); //2015-12-22
Если вам нужна информация о времени (час, минута, секунда), используйте некоторое преобразование от LocalDate
до LocalDateTime
LocalDate.parse("2015-12-22").atStartOfDay() //2015-12-22T00:00
См. JavaDoc:
month - значение, используемое для установки поля календаря MONTH. Значение месяца 0 на основе. например, 0 за январь.
Итак, месяц, который вы установили, - это первый месяц следующего года.
Представление Java Calendar не самое лучшее, они работают над ним для Java 8. Я бы посоветовал использовать Joda Time или другое подобное библиотека.
Вот краткий пример использования LocalDate из библиотеки времени Joda:
LocalDate localDate = new LocalDate(year, month, day);
Date date = localDate.toDate();
Здесь вы можете следовать учебному руководству по быстрому запуску.
Сделайте свою жизнь легкой при работе с датами, отметками времени и продолжительностью. Использовать HalDateTime из
http://sourceforge.net/projects/haldatetime/?source=directory
Например, вы можете просто использовать его для синтаксического анализа вашего ввода следующим образом:
HalDateTime mydate = HalDateTime.valueOf( "25.12.1988" );
System.out.println( mydate ); // will print in ISO format: 1988-12-25
Вы также можете указать шаблоны для синтаксического анализа и печати.