Tworzenie obiektu daty java na podstawie roku, miesiąca, dnia

100
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());  

Wynik to:

1988
Śr 25 stycznia 00:00:08 IST 1989

Mijam, 25 12 1988ale dostaję 25 Jan 1989. Czemu?

JAVAGeek
źródło
1
Co jest b w kodzie?
MysteryGuy

Odpowiedzi:

114

Miesiące w Kalendarzu są liczone od zera. Zatem 12 jest interpretowane jako grudzień + 1 miesiąc. Posługiwać się

c.set(year, month - 1, day, 0, 0);  
JB Nizet
źródło
5
Projektanci IBM API, projektanci JavaScript API. Poza tym prawdopodobnie nikt. Zauważ, że Kalendarz jest teraz przestarzały przez interfejs Java 8 java.time API, który działa właściwie.
JB Nizet,
67

To mój ulubiony sposób przed Java 8:

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

Powiedziałbym, że jest to czystsze podejście niż:

calendar.set(year, month - 1, day, 0, 0);
Fred Porciúncula
źródło
4
Miesiąc można określić za pomocą Calendarstałych np. Calendar.FEBRUARY.
Geekarist
1
Uważaj, w Javie 7 miesiące były numerowane od zera. Aby uniknąć problemów, używaj stałych.
jediz
Punkt do zrobienia - oba renderują różne wyniki podczas wywoływania getTime(). Ustawienie informacji w konstruktorze daje czas na początku dnia, podczas gdy to drugie podejście wykorzystuje aktualny czas. Zobacz dokumentację . Więc pierwsze jest prawdopodobnie lepszym podejściem, zakładając, co ludzie faktycznie próbują zrobić.
funct7
28

java.time

Korzystanie z java.timeframeworka wbudowanego w Javę 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

Jeśli potrzebujesz również informacji o czasie (godzina, minuta, sekunda) użyj konwersji z LocalDatenaLocalDateTime

LocalDate.parse("2015-12-22").atStartOfDay() //2015-12-22T00:00
Przemek
źródło
Dobra odpowiedź, ale określ strefę czasową, jeśli jest znana. A LocalDatenie ma strefy czasowej, więc nie reprezentuje dokładnego momentu na osi czasu. Jeśli kontekst wskazuje strefę czasową, zastosuj ją, aby uzyskać ZonedDateTimeobiekt: LocalDate.parse("2015-12-22").atStartOfDay( ZoneId.of( "America/Montreal" ) )
Basil Bourque,
9

Reprezentacja kalendarza w Javie nie jest najlepsza, pracują nad tym dla Javy 8. Radziłbym skorzystać z Joda Time lub innej podobnej biblioteki.

Oto krótki przykład użycia LocalDate z biblioteki Joda Time:

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

Tutaj możesz skorzystać z samouczka szybkiego startu.

Fdiazreal
źródło
6

Zobacz JavaDoc :

miesiąc - wartość służąca do ustawienia pola kalendarza MIESIĄC. Wartość miesiąca jest oparta na 0. np. 0 dla stycznia.

Tak więc ustawiony miesiąc jest pierwszym miesiącem następnego roku.

zw324
źródło
0

Ułatw sobie życie, pracując z datami, znacznikami czasu i czasem trwania. Użyj HalDateTime z

http://sourceforge.net/projects/haldatetime/?source=directory

Na przykład możesz po prostu użyć go do przeanalizowania danych wejściowych w następujący sposób:

HalDateTime mydate = HalDateTime.valueOf( "25.12.1988" );
System.out.println( mydate );   // will print in ISO format: 1988-12-25

Możesz także określić wzorce analizowania i drukowania.

Hajo Lemcke
źródło
3
Wygląda na to, że promujesz własną klasę w bibliotece? Prawdopodobnie jest to dozwolone, ale wyglądałoby ładniej, gdybyś wspomniał, że jesteś głównym programistą HalDateTime.
Ole VV
Nie głosowałem przeciw. Jednak życie z randkami nigdy nie jest łatwe. Twoja biblioteka nie zmieni tego faktu.
kiltek
Dlaczego głosować przeciw? Moja biblioteka pochodzi z 2013 roku. Cała funkcjonalność jest dostępna w java.time, jak określono w JSR 310, który osobiście uważam za jeden z najlepiej zaprojektowanych API. W pełni polecam używanie tego.
Hajo Lemcke