Datum - Monat und Jahr werden falsch angezeigt

libsch

Neues Mitglied
Hallo,

leider wird das Datum falsch ausgegeben, wenn ich es per Hand eingebe (siehe Zeile 2).

Java:
        sdf = new SimpleDateFormat("dd.MM.yyyy");
        datum1 = new Date(2023, 7, 19);
        datum2 = new Date();

        System.out.println(sdf.format(datum1));
        System.out.println(sdf.format(datum2));

Die Ausgabe ist:

19.08.3923
19.07.2023

Was muss ich machen, damit das erste Datum auch richtig angezeigt wird?
 
Etwas so

Java:
String datumString = "23.02.2012";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy");
Date zeitstempel = simpleDateFormat.parse(datumString);;
 
Was muss ich machen, damit das erste Datum auch richtig angezeigt wird?
Zuerst einmal nicht mehr Date oder Calendar verwenden. Das Zeug ist übel, z. B. beginnen Monate mit 0, während die Tage von 1 an gezählt werden. Nebenbei: der von Dir verwendete Konstruktor ist seit Java 1.1 deprecated, soll also seit Java 1.1 nicht mehr verwendet werden und kann theoretisch jederzeit aus den APIs fliegen.

Seit Java 8 gibt es eine "Time API", die findet sich in den Paketen, die mit java.time beginnen.

Java:
DateTimeFormatter shortFormat = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);

LocalDate datum1 = LocalDate.of(2023, 7, 19);
LocalDate datum2 = LocalDate.now();

System.out.println(datum1.format(shortFormat));
System.out.println(datum2.format(shortFormat));
 
Unabhängig von den Lösungen: Bei so Dingen ist immer wichtig, dass man die Dokumentation liest! Das Java Framework hat eine umfangreiche Dokumentation und in der kann man genau nachlesen, wie die einzelnen Klassen zu benutzen sind.

Nehmen wir also einfach die Klasse Date mit dem Konstruktor, den Du nutzt:
Date (Java Platform SE 8 ) (oracle.com)
Das ist die Beschreibung, die zu dem Java 8 Framework passt.

Und wir erkennen als erstes: Der verwendete Konstruktor ist Deprecated, d.h. er sollte nicht mehr genutzt werden!
Und dann schauen wir uns die Beschreibung des Konstruktors an:
@Deprecated
public Date(int year,
int month,
int date)
Deprecated. As of JDK version 1.1, replaced by Calendar.set(year + 1900, month, date) or GregorianCalendar(year + 1900, month, date).
Allocates a Date object and initializes it so that it represents midnight, local time, at the beginning of the day specified by the year, month, and date arguments.
Parameters:
year - the year minus 1900.
month - the month between 0-11.
date - the day of the month between 1-31.

Damit ist dann auch klar, was Du angeben musst:
  • Beim Jahr das Jahr minus 1900
  • Die Monate sind 0 basierend, d.h. es fängt mit Januar = 0 an (Also musst Du da minus 1 nehmen)

Das also wirklich als ganz wichtiger Hinweis! Mach Dir ein Lesezeichen für die Java API Dokumentation der Java Version, die Du verwendest! Wobei auch Google da in der Regel hilft - die obere Seite findet man also auch mit der Suche "Java 8 Date class". Der erste Treffer bei der Suche mit Bing war übrigens direkt zur neuen Date/Time API:
Java 8 - New Date/Time API | Tutorialspoint

Ich nutze ansonsten derzeit Java 17 und habe direkt in der Lesezeichen Leiste:
Overview (Java SE 17 & JDK 17) (oracle.com)
 

Zurück
Oben