Створення об'єкта дати Java з року, місяця, дня


94
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. Чому?


1
Що в коді b?
MysteryGuy

Відповіді:


109

Місяці в календарі базуються на нулі. Отже, 12 трактується як грудень + 1 місяць. Використовуйте

c.set(year, month - 1, day, 0, 0);  

5
Дизайнери API IBM, дизайнери API JavaScript. Окрім цього, мабуть, ніхто. Зверніть увагу, що Календар тепер застарілий за допомогою Java 8 java.time API, який робить правильно.
JB Nizet

63

Це мій улюблений спосіб до Java 8:

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

Я б сказав, що це більш чистий підхід, ніж:

calendar.set(year, month - 1, day, 0, 0);

4
Місяць можна вказати, використовуючи Calendarконстанти, наприклад. Calendar.FEBRUARY.
Geekarist

1
Обережно, раніше місяці в Java 7 нумерували нулем. Використовуйте константи, щоб уникнути неприємностей.
jediz

25

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

Хороша відповідь, але вкажіть часовий пояс, якщо він відомий. A LocalDateне має часового поясу, а тому не відображає точного моменту на часовій шкалі. Якщо ваш контекст вказує часовий пояс, застосуйте його, щоб отримати ZonedDateTimeоб’єкт: LocalDate.parse("2015-12-22").atStartOfDay( ZoneId.of( "America/Montreal" ) )
Василь Бурк

8

Представлення календаря Java не найкраще, вони працюють над ним для Java 8. Я б порадив вам використовувати Joda Time або іншою подібною бібліотекою.

Ось короткий приклад використання LocalDate з бібліотеки Joda Time:

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

Тут ви можете дотримуватися підручника з швидкого початку.


6

Див. JavaDoc :

місяць - значення, що використовується для встановлення поля календаря МІСЯЦЬ. Місячне значення базується на 0. наприклад, 0 за січень.

Отже, встановлений вами місяць - це перший місяць наступного року.


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. Я повністю рекомендую використовувати його.
Хаджо Лемке,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.