Erstellen eines Java-Datumsobjekts aus Jahr, Monat und Tag

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

Ausgabe ist:

1988
Mi Jan 25 00:00:08 IST 1989

Ich gehe vorbei, 25 12 1988aber ich bekomme 25 Jan 1989. Warum?

JAVAGeek
quelle
1
Was ist b im Code?
MysteryGuy

Antworten:

109

Monate basieren im Kalender auf Null. 12 wird also als Dezember + 1 Monat interpretiert. Verwenden

c.set(year, month - 1, day, 0, 0);  
JB Nizet
quelle
5
IBM API-Designer, JavaScript-API-Designer. Sonst wahrscheinlich niemand. Beachten Sie, dass der Kalender jetzt von der Java 8 java.time-API überholt ist, die das Richtige tut.
JB Nizet
62

Das ist mein Lieblingsweg vor Java 8:

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

Ich würde sagen, dies ist ein sauberer Ansatz als:

calendar.set(year, month - 1, day, 0, 0);
Fred Porciúncula
quelle
4
Der Monat könnte mit CalendarKonstanten angegeben werden, z. Calendar.FEBRUARY.
Geekarist
1
Beachten Sie, dass die Monate in Java 7 von Null an nummeriert waren. Verwenden Sie Konstanten, um Probleme zu vermeiden.
jediz
25

java.time

Verwenden eines java.timein Java 8 integrierten Frameworks

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

Wenn Sie auch Informationen zur Zeit (Stunde, Minute, Sekunde) benötigen, verwenden Sie eine Konvertierung von LocalDatenachLocalDateTime

LocalDate.parse("2015-12-22").atStartOfDay() //2015-12-22T00:00
Przemek
quelle
Gute Antwort, aber geben Sie eine Zeitzone an, falls bekannt. A LocalDatehat keine Zeitzone und repräsentiert daher keinen genauen Moment auf der Zeitachse. Wenn Ihr Kontext eine Zeitzone angibt, wenden Sie diese an, um ein ZonedDateTimeObjekt zu erhalten: LocalDate.parse("2015-12-22").atStartOfDay( ZoneId.of( "America/Montreal" ) )
Basil Bourque
8

Javas Kalenderdarstellung ist nicht die beste, sie arbeiten daran für Java 8. Ich würde Ihnen raten, Joda Time oder eine andere ähnliche Bibliothek zu verwenden.

Hier ist ein kurzes Beispiel mit LocalDate aus der Joda Time-Bibliothek:

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

Hier können Sie einem Schnellstart-Tutorial folgen.

Fdiazreal
quelle
6

Siehe JavaDoc :

Monat - Der Wert, mit dem das Kalenderfeld MONAT festgelegt wird. Der Monatswert basiert auf 0. zB 0 für Januar.

Der von Ihnen festgelegte Monat ist also der erste Monat des nächsten Jahres.

zw324
quelle
0

Machen Sie sich das Leben leichter, wenn Sie mit Daten, Zeitstempeln und Dauern arbeiten. Verwenden Sie HalDateTime von

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

Zum Beispiel können Sie es einfach verwenden, um Ihre Eingabe wie folgt zu analysieren:

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

Sie können auch Muster zum Parsen und Drucken angeben.

Hajo Lemcke
quelle
3
Sieht so aus, als würden Sie Ihre eigene Bibliotheksklasse bewerben? Das ist wahrscheinlich erlaubt, aber es würde besser aussehen, wenn Sie erwähnen, ob Sie ein Hauptentwickler von sind HalDateTime.
Ole VV
Ich habe nicht abgelehnt. Mit Datteln ist das Leben jedoch nie einfach. Ihre Bibliothek wird diese Tatsache nicht ändern.
Kiltek
Warum abstimmen? Meine Bibliothek stammt aus dem Jahr 2013. Alle Funktionen sind in java.time verfügbar, wie in JSR 310 angegeben. Ich persönlich finde, dass dies eine der am besten gestalteten APIs ist. Ich kann es nur empfehlen.
Hajo Lemcke