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?


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

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

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

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.


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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.