Создание объекта даты Java из года, месяца, дня

99
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. Зачем?

JAVAGeek
источник
1
Что стоит в коде?
MysteryGuy

Ответы:

113

Месяцы в календаре отсчитываются от нуля. Таким образом, 12 интерпретируется как декабрь + 1 месяц. Использовать

c.set(year, month - 1, day, 0, 0);  
JB Nizet
источник
5
Дизайнеры IBM API, дизайнеры JavaScript API. Кроме этого, вероятно, никто. Обратите внимание, что Calendar теперь является устаревшим из-за API Java 8 java.time, который работает правильно.
JB Nizet
67

Это мой любимый способ до Java 8:

Date date = new GregorianCalendar(year, month - 1, day).getTime();

Я бы сказал, что это более чистый подход, чем:

calendar.set(year, month - 1, day, 0, 0);
Фред Порсиункула
источник
4
Месяц можно указать с помощью Calendarконстант, например. Calendar.FEBRUARY.
Geekarist 08
1
Остерегайтесь, раньше месяцы в Java 7 нумерулись с нуля. Во избежание проблем используйте константы.
jediz
Стоит отметить, что при вызове они дают разные результаты getTime(). Информация о настройке в конструкторе дает время в начале дня, тогда как последний подход использует текущее время. См. Документы . Так что первый, вероятно, лучший подход, если исходить из того, что люди на самом деле пытаются делать.
funct7
28

java.time

Использование 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
Przemek
источник
Хороший ответ, но укажите часовой пояс, если он известен. A LocalDateне имеет часового пояса и поэтому не представляет точный момент на временной шкале. Если в вашем контексте указан часовой пояс, примените его, чтобы получить ZonedDateTimeобъект: LocalDate.parse("2015-12-22").atStartOfDay( ZoneId.of( "America/Montreal" ) )
Бэзил Бурк,
9

Представление календаря в Java не самое лучшее, над ним работают для Java 8. Я бы посоветовал вам использовать Joda Time или другую подобную библиотеку.

Вот быстрый пример использования LocalDate из библиотеки Joda Time:

LocalDate localDate = new LocalDate(year, month, day);
Date date = localDate.toDate();

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

Фдиазреал
источник
6

См. JavaDoc :

месяц - значение, используемое для установки поля календаря МЕСЯЦ. Значение месяца отсчитывается от 0. например, 0 для января.

Итак, установленный вами месяц - это первый месяц следующего года.

zw324
источник
0

Сделайте свою жизнь проще, работая с датами, отметками времени и продолжительностью. Используйте 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

Вы также можете указать шаблоны для анализа и печати.

Хайо Лемке
источник
3
Похоже, вы продвигаете свой собственный библиотечный класс? Вероятно, это разрешено, но было бы лучше, если бы вы упомянули, являетесь ли вы основным разработчиком HalDateTime.
Оле В.В.
Я не голосовал против. Однако с финиками жизнь никогда не бывает легкой. Ваша библиотека не изменит этого факта.
kiltek
Почему голосование против? Моя библиотека датируется 2013 годом. Все функции доступны в java.time, как указано в JSR 310, который я лично считаю одним из лучших разработанных API. Я полностью рекомендую его использовать.
Hajo Lemcke