Methode, die mit einem Datum arbeitet?

Wuast

Bekanntes Mitglied
Hallo Leute,

gibt es eine Möglichkeit, mit einer Datumseingabe über die Konsole in Java zu arbeiten?
Also z.B. bei der man ein Datum eingeben könnte wie 01.05. oder so, welches in einer Variable gespeichert wird und mithilfe derer man die restliche Anzahl der Tage im Jahr ermitteln könnte.

Beim 01.05. wär das ja Mai, Juni, Juli, August, September, Oktober, Novemer, Dezember, d.h. 8 * 30 = 240 Tage bis zum Jahresende.
Bei 15.05. wär das ja (30-15) + (7*30) = 225.

Bin bisher nur auf LocalDateTime gestoßen. Gibt es da eine einfache Möglichkeit, dass mir Java bei Eingabe eines Datums einen int-Wert zurückgibt, z.B. die Differenz zu 30 Tagen im Monat oder auch direkt 360 Tagen im Jahr?

Bin auch für Tipps zu anderen Herangehensweisen dankebar. Ich wollte allerdings jetzt nicht abfragen nach dem Motto (stark vereinfacht)

Java:
System.out.println("Bitte Tag des Monats angeben");
    int tag = java.util.Scanner(System.in).nextInt();
   
System.out.println("Bitte den entsprechenden Monat angeben");
    int monat = java.util.Scanner(System.in).nextInt();

    int monateZurBerechnung = 12-monat;
    int tageZurBerechnung = 30-tag;

    int resttageImJahr = monateZurBerechnung*30-tageZurBerechnung;

sondern wenns geht direkt das gesamte Datum eingeben lassen. Hoffe ich habe mich verständlich ausgedrückt.
Danke und

Viele Grüße
Yannik
 
Zuletzt bearbeitet:
Gibt es, die Methode parse z.B. https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/LocalDate.html

Es haben übrigens nicht alle Monate 30 Tage, oder ist das eine spezielle Anforderung?
Ich danke.
Kannst du mir einmal aufzeigen, wie ich die Methode nutze? Ich steh da etwas auf dem Schlauch, wie ich jetzt aus
Java:
public static LocalDate parse;
an mein Datum komme, um damit weiterzurechnen?

Quasi, denn soweit ich weiß rechnen Banken immer mit 30 Tagen pro Monat bei der Verzinsung. Korrigiere mich wenn das falsch ist. 🙂
 
Zuletzt bearbeitet:
Sehr gut. =)

Kannst du bzgl. oben nachgeschossener Frage noch eine kurze Auskunft geben? Stehe da etwas auf dem Schlauch gerade.

Java:
        Scanner input = new Scanner(System.in);
        
        LocalDate parse = input;
dachte ich, aber ich würd nicht fragen wenn das richtig wäre 😀
 
Das sollte dir hilfreich sein...

Java:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;

public class Bank {
    public static Duration monatDauer(String datum) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date d = format.parse(datum);
        LocalDate ld = d.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        return Duration.between(ld.withDayOfMonth(1).atStartOfDay(), ld.withDayOfMonth(1).plusMonths(1).atStartOfDay());
    }

    public static int monatOrdinal(String datum) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date d = format.parse(datum);
        LocalDate ld = d.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        return ld.getMonth().ordinal() + 1;
    }

    public static void main(String[] args) throws ParseException {
        String datum = "2021-11-23";
        System.out.println("monatOrdinal(datum) = " + monatOrdinal(datum));
        System.out.println("monatDauer(datum) = " + monatDauer(datum).toDays());
    }
}
 
Das sollte dir hilfreich sein...

Java:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;

public class Bank {
    public static Duration monatDauer(String datum) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date d = format.parse(datum);
        LocalDate ld = d.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        return Duration.between(ld.withDayOfMonth(1).atStartOfDay(), ld.withDayOfMonth(1).plusMonths(1).atStartOfDay());
    }

    public static int monatOrdinal(String datum) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date d = format.parse(datum);
        LocalDate ld = d.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        return ld.getMonth().ordinal() + 1;
    }

    public static void main(String[] args) throws ParseException {
        String datum = "2021-11-23";
        System.out.println("monatOrdinal(datum) = " + monatOrdinal(datum));
        System.out.println("monatDauer(datum) = " + monatDauer(datum).toDays());
    }
}
Wow danke..
Sorry dass ich so blöd nachfrage.. aber einfacher geht das nicht? 😀
Ich kann auch meine erste Idee aufgreifen. Sieht nicht so professionell aus aber erfüllt seinen Zweck auch. Ich will ja eigntl nur die Tage von 0 bis zu zu einem Datum X der Konsoleneingabe als ganze Zahl von 360 abziehen und die Zahl in einen int packen, um die Verzinsung am Jahresende auszurechnen.
 
Du kannst auch selbst die Eingabe parsen, wenn Dir das lieber ist.
Dann holst Du per next() oder nextLine() einen String. Da Du eine Eingabe getrennt durch . erwartet hast ("01.05" war Dein Beispiel), kannst Du dann her gehen und den String an den . aufteilen (String.split - aber Achtung: Das nimmt einen regulären Ausdruck, daher muss der . ein \ davor bekommen: "\\.")
Und dann hast Du ein Array von Strings, die Du auswerten kannst, also z.B. die Anzahl prüfen (2 oder 3 - je nachdem, ob ein Jahr mit angegeben wurde) und dann als Integer parsen. So hast Du dann Dein Tag und den Monat.

Quasi, denn soweit ich weiß rechnen Banken immer mit 30 Tagen pro Monat bei der Verzinsung.
Wenn hier nicht mit dem konkreten Jahr gerechnet wird, dann würde ich auch nicht auf einen Datentyp setzen wie LocalDate. Der bietet Dir ja nichts, was Du nutzen kannst. Unter dem Strich wirst Du nur den Tag und den Monat auslesen, um dann darauf aufbauend die Berechnung zu machen.

Auf LocalDate (oder ähnliche Klassen) wird aber oft zurück gegriffen, weil die Anforderung in der Regel anders ist. Da soll ein Datum vom Benutzer eingegeben werden können, so wie er es gewohnt ist: Man stellt sich seinen Rechner ja ein und hat dann z.B. ein Datumsformat. Bei uns ist üblich: tag.monat.jahr aber es gibt natürlich auch monat/tag/jahr oder tag/monat/jahr und so wenn man z.B. nach UK oder US schaut. ==> Diese Einstellung nennt man Locale. Und von einer Applikation wird erwartet, dass die sich nach dem richtet, das man eingestellt hat und das ist eine Komplexität, die prinzipiell in den ganzen Klassen mit erledigt ist.

Da Du diese Komplexität in Deiner Applikation aber nicht willst, kannst Du es entsprechend einfach halten.
 
Du kannst auch selbst die Eingabe parsen, wenn Dir das lieber ist.
Dann holst Du per next() oder nextLine() einen String. Da Du eine Eingabe getrennt durch . erwartet hast ("01.05" war Dein Beispiel), kannst Du dann her gehen und den String an den . aufteilen (String.split - aber Achtung: Das nimmt einen regulären Ausdruck, daher muss der . ein \ davor bekommen: "\\.")
Und dann hast Du ein Array von Strings, die Du auswerten kannst, also z.B. die Anzahl prüfen (2 oder 3 - je nachdem, ob ein Jahr mit angegeben wurde) und dann als Integer parsen. So hast Du dann Dein Tag und den Monat.
Das ist relativ Wurscht, ob mit Strich oder Punkt. Muss es ja nur vorgeben, z.B. "bitte im Format mm-dd" oder so.

Ich habe noch nie etwas geparst, kannst du mir ein einfaches Beispiel geben, wie die Syntax da richtig lautet?
Java:
    public int anlegenDauer () {
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("Bitte Datum eingeben im Format mm-dd.");
        int anlageDatum = Integer.parseInt(scanner.next());
        return anlageDatum;
        
    }
Ist glaube ich noch nicht ganz richtig, ich will ja 2 int haben. Wie ich da jetzt an die Arrays komme check ich gerade nicht.

Liebe Grüße und wie immer herzlichen Dank an alle 🙂
 
Ist glaube ich noch nicht ganz richtig, ich will ja 2 int haben. Wie ich da jetzt an die Arrays komme check ich gerade nicht.
Das hat Dir @kneitzel oben schon beschrieben:

1. einen String(!) per scanner.next() oder scanner.nextLine() einlesen
2. die split-Methode von String verwenden.

Beispielsweise liefert "02-04-07".split("-") ein String-Array {"02", "04", "07"}.
 
Das hat Dir @kneitzel oben schon beschrieben:

1. einen String(!) per scanner.next() oder scanner.nextLine() einlesen
2. die split-Methode von String verwenden.

Beispielsweise liefert "02-04-07".split("-") ein String-Array {"02", "04", "07"}.
Java:
String in = scanner.next();
in.split("-");
//jetzt habe ich
in {"02", "07"}
korrekt?

Java:
int month = Integer.parseInt(in[0]);
int day = Integer.parseInt(in[1]);
gibt aber den Fehler, dass der "type of expression must be an array type but is resolved to String".


Aber sehr cool und spannend mit dem parsen 🙂
 
Sorry dass ich so blöd nachfrage.. aber einfacher geht das nicht?
Nein, die neue Date-Api ist etwas aufgebläht... 😀 (misslungen will ich jetzt nicht sagen 😉 )

Selber würde da keinesfalls etwas parsen. Das ist das dümmste, was man machen könnte.

Anstatt LocalDate könntest du auch GregorianCalendar verwenden, je nachdem was du möchtest
 
Selber würde da keinesfalls etwas parsen. Das ist das dümmste, was man machen könnte.
Tja, und ich dachte immer, dass Dümmste, was man machen kann, wäre: Behauptungen aufstellen ohne irgendwelche Argumente zu bringen. Und dabei auch noch ausfallend zu werden....

Aber so haben wir halt unterschiedliche Meinungen - ich halte halt einfach deinen Code für unzureichend, da er:
- überkompliziert ist
- Für den TE offensichtlich nicht geeignet.
Das wären z.B. zwei Argumente, aber von denen musst Du Dich nicht verwirren lassen 😀
 
@Wuast, er hat seinen Code in #6 absichtlich so kompliziert geschrieben...
hat ja trotzdem geklappt 😀 Spaß beiseite, ist halt alte Foren-Gewohnheit. Meinungsverschiedenheiten arten da schnell aus, aber alles gut.

Nein, in.split() verändert nicht den Typ von in, sondern es wird ein String-Array zurückgegeben.
Aber ist
Java:
String in = scanner.next();

// nicht

in [] {"02", "07"}

//wenn die Konsoleneingabe zu dem String 02-07 war?
 
- überkompliziert ist
- Für den TE offensichtlich nicht geeignet.
Ich bin beruhigt, dass nicht nur ich ihn kompliziert finde. Liegt aber sicherlich auch daran, dass ich totaler Anfänger bin, noch mit den basics kämpfe und vllt. auch etwas einfacheres erwartet habe 😉
Erklärt auch, warum er für mich wohl weniger geeignet ist. Wobei ich gerade feststelle, dass es mit dem parsen und dem String Array ja auch nicht so hinhaut wie ich angenommen habe 😌
 
Dann ist in nichts anderes als "02-07".

Du suchst etwas wie:
Java:
String in; // in ist vom Typ String
in = scanner.next();

String[] arr; // arr ist vom Typ String[], also ein String-Array
arr = in.split("-");
Wenn Du "02-07" (ohne Anführungszeichen natürlich) eingibst, dann ist arr ein String-Array mit 2 Elementen: "02" und "07".
 
Dann ist in nichts anderes als "02-07".

Du suchst etwas wie:
Java:
String in; // in ist vom Typ String
in = scanner.next();

String[] arr; // arr ist vom Typ String[], also ein String-Array
arr = in.split("-");
Wenn Du "02-07" (ohne Anführungszeichen natürlich) eingibst, dann ist arr ein String-Array mit 2 Elementen: "02" und "07".
Achso, ich hatte es so verstanden, dass automatisch bei dem split der array erzeugt wird.
also array erzeugen und mit dem String.split inilitalisieren

Damit sollte es doch dann möglich sein
Java:
int month = Integer.parseInt(arr[0]);
entsprechend zu parsen?!
 
dass automatisch bei dem split der array erzeugt wird.
Das wird es auch: die split-Methode erzeugt ein Array und gibt eine Referenz auf dieses Array zurück. Das hilft Dir aber nichts, wenn Du die Referenz nicht in einer Variablen speicherst.

Die Funktionsweise ist bei allen Methoden mit Rückgabewert gleich: die Methode "erzeugt" diesen Rückgabewert, nur wenn Du den Rückgabewert nicht speicherst, bringt er Dir nix.

Java:
double wert;
Math.sin(Math.PI); // schön, aber nutzlos
wert = Math.sin(Math.PI); // jetzt kann man mit dem Ergebnis auch was anfangen, weil es in wert gespeichert wurde

Java:
String[] arr;
"01-02".split("-"); // schön, aber nutzlos
arr = "01-02".split("-"); // jetzt kann man mit dem Ergebnis auch was anfangen, weil es in arr gespeichert wurde

Damit sollte es doch dann möglich sein
Java:
int month = Integer.parseInt(arr[0]);
entsprechend zu parsen?!
Ja.
 
Das wird es auch: die split-Methode erzeugt ein Array und gibt eine Referenz auf dieses Array zurück. Das hilft Dir aber nichts, wenn Du die Referenz nicht in einer Variablen speicherst.

Die Funktionsweise ist bei allen Methoden mit Rückgabewert gleich: die Methode "erzeugt" diesen Rückgabewert, nur wenn Du den Rückgabewert nicht speicherst, bringt er Dir nix.

Java:
double wert;
Math.sin(Math.PI); // schön, aber nutzlos
wert = Math.sin(Math.PI); // jetzt kann man mit dem Ergebnis auch was anfangen, weil es in wert gespeichert wurde

Java:
String[] arr;
"01-02".split("-"); // schön, aber nutzlos
arr = "01-02".split("-"); // jetzt kann man mit dem Ergebnis auch was anfangen, weil es in arr gespeichert wurde


Ja.
Stimmt ... Danke (an alle)! 🙂
 
Gut, dann kann ich ja jetzt nochmal kurz richtigstellen, was es mit der "komplizierten" Time API auf sich hat:
Java:
Scanner input = new Scanner(System.in);
String datumText = input.next();

DateTimeFormatter format = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
LocalDate datum = LocalDate.parse(datumText, format);

int tagImJahr = datum.getDayOfYear();
int tageImMonat = datum.lengthOfMonth();
int monatAlsZahl= datum.getMonthValue();
🙂
 

Neue Themen


Zurück
Oben