User input in Verbindung mit ChronoUnit anpassen und falls falsche Eingabe getätigtwird

triade

Aktives Mitglied
Hallo, ich habe einen Code geschrieben der einen den zeitlichen abstand zwischen zwei vom user eingegebenen abstände ausrechnet.
Habe mit den eingaben allerdings mit dem Input und zwar zum einen muss man jetzt immer erst das Jahr dann, Monat und dann das Datum und das alles einzeln kompakter und idiotensicherer wäre wenn man alles zsm eingeben könnte z.b YYYY.MM.DD. Und zu dem punkt idiotensicher auch wenn man aufgefodert wird erst die ältere Zeitangabe einzufügen und dann die neuere wäre es schön wenn der Code damit umgehen könnte, verscuht ahbe ich wenn eben der zeitabschnitt negativ ist was passiert wenn man erst die jüngere zeit eingibt der Code alle negativen werte mit -1 multiplizieren soll was diese positiv machen sollte, klappt aber nd. Ich hatte auch versucht was aber jetzt weg vom Code ist mit einer if Anweisung zu schauen welches Jahr kleiner ist und das eben danach gerechnet wird das Problem war allerdings wenn das Jahr gleich ist aber der Monat oder der Tag nicht passten. Weiß wer was man da machen kann?#

mein
Java:
import java.util.Scanner;
import java.time.temporal.ChronoUnit;
import java.time.LocalDate;

public class Zeitabstand
{
    public static void main(String[] args)
    {
        Scanner zeta = new Scanner(System.in);
       
        System.out.println("Hallo ich rechenn Ihnen den zeitlichen abstand zwichen zwei Zeiten aus. In Monaten, Wochen & Tagen. Geben sie dafür bitte erst den die ältere zeit das die kleinere und erst Jahr dan Monat dann den Tag!");
       
        int jahr, monat, tag, jahr2, monat2, tag2;

        jahr = zeta.nextInt();
        monat = zeta.nextInt();
        tag = zeta.nextInt();

        jahr2 = zeta.nextInt();
        monat2 = zeta.nextInt();
        tag2 = zeta.nextInt();

        LocalDate datum1 = LocalDate.of(jahr,monat,tag);
        LocalDate datum2 = LocalDate.of(jahr2,monat2,tag2);
           

     
            long monate = ChronoUnit.MONTHS.between(datum1, datum2);
            long wochen = ChronoUnit.WEEKS.between(datum1, datum2);
            long tage = ChronoUnit.DAYS.between(datum1, datum2);

            if(monate>0 || wochen>0 || tage>0 )
            {
                monate = monate *-1;
                wochen = wochen *-1;
                tage = tage *-1;
            }
                System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + monate + " Monate.");
                System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + wochen + " Wochen.");
                System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + tage + " Tage.");
         
           /*else
            {
                System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + monate + " Monate.");
                System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + wochen + " Wochen.");
                System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + tage + " Tage.");
            }
            */
           
        /*  der versuch mit dem JAhr:
        if (jahr < jahr2)
        {
            long monate = ChronoUnit.MONTHS.between(datum1, datum2);
            long wochen = ChronoUnit.WEEKS.between(datum1, datum2);
            long tage = ChronoUnit.DAYS.between(datum1, datum2);

           
            System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + monate + " Monate.");
            System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + wochen + " Wochen.");
            System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + tage + " Tage.");
        }
        else
        {
            long monate = ChronoUnit.MONTHS.between(datum2, datum1);
            long wochen = ChronoUnit.WEEKS.between(datum2, datum1);
            long tage = ChronoUnit.DAYS.between(datum2, datum1);

           
            System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + monate + " Monate.");
            System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + wochen + " Wochen.");
            System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + tage + " Tage.");
        */
     
        }
    }
}
Anmerkung zur Fragestellung diese ist unvollendet entschuldigen sie mich bitte falls dies zur Missverständnissen führt habe diese aber mittendrin ausersehen abgeschickt.
 

triade

Aktives Mitglied
zu dem zweiten also der er drauf achtet welcher Zeitraum älter ist usw. klappt jetzt hatte die größer kleiner Zeichen einfach falsch. Hatte schon immer meine Unstimmigkeiten mit den :}
 

mihe7

Top Contributor
Du kannst mit dem Scanner eine Zeile einlesen und dann das Datum parsen.

Hier mal ein Beispiel mit einem DateTimeFormatter, der alles mögliche akzeptiert: 6.3.23, 6.03.23, 06.3.23, 06.03.23 und natürlich auch mit vierstelligen Jahreszahlen. Die Methode readDate ist aber noch ohne Fehlerbehandlung, wenn Du also Mist eingibst (z. B. eine leere Zeile), dann bricht das Programm mit einer Exception ab.

Java:
import java.time.LocalDate;
import java.time.Year;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.util.Scanner;

class Test {
    private static final Scanner input = new Scanner(System.in);
    private static final DateTimeFormatter format = new DateTimeFormatterBuilder()
            .appendPattern("d.M.")
            .appendValueReduced(ChronoField.YEAR, 2, 4, Year.now().getValue() - 80)
            .toFormatter();

    public static void main(final String[] args) {
        final LocalDate firstDate = readDate("erste");       
        final LocalDate secondDate = readDate("zweite");
        final LocalDate from = min(firstDate, secondDate);
        final LocalDate until = max(firstDate, secondDate);
        final long months = ChronoUnit.MONTHS.between(from, until);
        final long weeks = ChronoUnit.WEEKS.between(from, until);
        final long days = ChronoUnit.DAYS.between(from, until);
        System.out.printf("Der Abstand zwischen den beiden Tagen beträgt %d Tage bzw. %d Wochen bzw. %d Monate.%n",
                days, weeks, months);
    }

    private static LocalDate min(final LocalDate first, final LocalDate second) {
        return first.isBefore(second) ? first : second;
    }

    private static LocalDate max(final LocalDate first, final LocalDate second) {
        return first.isBefore(second) ? second : first;
    }

    private static LocalDate readDate(final String which) {
        System.out.print("Bitte geben Sie das " + which + " Datum im Format tt.mm.jjjj ein: ");
        final String line = input.nextLine().trim();
        return LocalDate.parse(line, format);
    }
}
 

triade

Aktives Mitglied
Du kannst mit dem Scanner eine Zeile einlesen und dann das Datum parsen.

Hier mal ein Beispiel mit einem DateTimeFormatter, der alles mögliche akzeptiert: 6.3.23, 6.03.23, 06.3.23, 06.03.23 und natürlich auch mit vierstelligen Jahreszahlen. Die Methode readDate ist aber noch ohne Fehlerbehandlung, wenn Du also Mist eingibst (z. B. eine leere Zeile), dann bricht das Programm mit einer Exception ab.
Hey, vielen Dank für die antwortnich muss aber sagen das dein Code da er Bestandteile beinhaltet die ich nicht kenne kompliziert wirkt, ich konnte meinen Code verbessern hier ist meine Lösung:
Java:
import java.util.Scanner;
import java.time.temporal.ChronoUnit;
import java.time.LocalDate;

public class Zeitabstand
{
    public static void main(String[] args)
    {
        Scanner zeta = new Scanner(System.in);
       
        System.out.println("Hallo ich rechenn Ihnen den zeitlichen abstand zwichen zwei Zeiten aus." + "\n" + "In Monaten, Wochen & Tagen." + "\n" + "Geben sie dafür bitte erst den die ältere zeit ein, folglich die neuere." + "\n" + "bitte im format JJJJ-MM-TT");
       
     
       
        int jahr, monat, tag, jahr2, monat2, tag2;

        String zeit1 = zeta.nextLine();

        String[] dteile = zeit1.split("-");
        jahr = Integer.parseInt(dteile[0]);
        monat = Integer.parseInt(dteile[1]);
        tag = Integer.parseInt(dteile[2]);

        String zeit2 = zeta.nextLine();

        String[] dteile2 = zeit2.split("-");
        jahr2 = Integer.parseInt(dteile2[0]);
        monat2 = Integer.parseInt(dteile2[1]);
        tag2 = Integer.parseInt(dteile2[2]);
           
       
        LocalDate datum1 = LocalDate.of(jahr,monat,tag);
        LocalDate datum2 = LocalDate.of(jahr2,monat2,tag2);
           

     
            long monate = ChronoUnit.MONTHS.between(datum1, datum2);
            long wochen = ChronoUnit.WEEKS.between(datum1, datum2);
            long tage = ChronoUnit.DAYS.between(datum1, datum2);

            if(monate<0 || wochen<0 || tage<0 )
            {
                monate = monate *-1;
                wochen = wochen *-1;
                tage = tage *-1;
            }

            System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + monate + " Monate.");
            System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + wochen + " Wochen.");
            System.out.println("Der abstand zwichen den beiden Zeiten beträgt " + tage + " Tage.");
         
         
    }
   
}
 

mihe7

Top Contributor
muss aber sagen das dein Code da er Bestandteile beinhaltet die ich nicht kenne kompliziert wirkt
Das ist durchaus beabsichtigt, um zu vermeiden, dass Leute ihre Hausaufgaben einfach per Copy & Paste erledigen :)

Also, bleiben wir mal bei Deinem Code: klar, das kann man schon so machen. Ein kleiner Tipp: schau Dir mal Math.abs() an, damit kannst Du Dir den if-Block sparen, z. B.
Java:
long monate = Math.abs(ChronoUnit.MONTHS.between(datum1, datum2));

Der nächste Schritt bestünde in der Erkenntnis, dass da viel doppelter Code enthalten ist. Du liest zweimal eine Zeile ein, Du teilst zweimal eine Zeile in ihre Bestandteile auf, Du extrahierst Jahr, Monat und Tag - zweimal - und natürlich baust Du dann auch zweimal das Datum zusammen. Das wären dann so Dinge, die man in eine Methode auslagert, um den Code nur einmal schreiben/warten zu müssen.

Wenn Du die Zeile 32 mal hochziehst, hättest Du beispielsweise stehen:
Java:
        String[] dteile = zeit1.split("-");
        jahr = Integer.parseInt(dteile[0]);
        monat = Integer.parseInt(dteile[1]);
        tag = Integer.parseInt(dteile[2]);
        LocalDate datum1 = LocalDate.of(jahr,monat,tag);
Dieser Block wandelt also den String zeit1 in ein LocalDate datum1 um. Genau das gleiche machst Du mit zeit2... Der Block lässt sich aber einfach in eine Methode auslagern:
Java:
private static LocalDate ermittleDatum(String text) {
    String[] teile = text.split("-");
    int jahr = Integer.parseInt(teile[0]);
    int monat = Integer.parseInt(teile[1]);
    int tag = Integer.parseInt(teile[2]);
    return LocalDate.of(jahr, monat, tag);
}
Damit hast Du eine Methode (aka Funktion), die einen Text als Parameter erwartet und dafür dann ein LocalDate zurückgibt.

In main kann damit Zeile 15 komplett entfallen, und die Zeilen 19 bis 33 kannst Du ersetzen durch:
Java:
    String zeit1 = zeta.nextLine();
    LocalDate datum1 = ermittleDatum(zeit1);
    String zeit2 = zeta.nextLine();
    LocalDate datum2 = ermittleDatum(zeit2);

Das ist doch schon viel schöner. Da Du aber mit LocalDate arbeitest, kannst Du ach mit DateTimeFormatter arbeiten. Wenn Du ein ISO-Datum parsen möchtest, kannst Du auch auf vordefinierte DateTimeFormatter zurückgreifen:
Java:
LocalDate datum1 = LocalDate.parse(zeit1, DateTimeFormatter.ISO_LOCAL_DATE);
Damit bräuchtest Du die Methode ermittleDatum auch nicht mehr.
 

triade

Aktives Mitglied
Hey, vielen Dank erstmal sehe deine Antwort zwar etwas spät, werde dennoch dies was ich an deinen verbesserungen verstehe(da ich nichts anwenden möchte was ich nicht verstehe) in meinen Code verbessern. Ich hätte allerdings eine frage undzwar weißt Du ob es eine Methode oder einen Befehl gibt der mit statt wie es nis jetzg isg alle Monate, Wochen oder Tage ausgerechnet werden mit die genaue zeit in Jahren, dann die restlicjen Monate, Wochen und Tahen ausgibt. Denn man kann zwar auch die Jahre so bestimmen lassen aber eben mir ist leider nixhts bekannt wo alles bestimmt wird. Der Gedanke das man dies Ermitteln könnte war da, allerdings das die Monate unregelmäßige Tage haben und es Schaltjahre gibt macht der Idee die Jahre mit 365 mal zu nehmen es abzuziehen usw… zu nichte.
 

mihe7

Top Contributor
Hast Du ein Beispiel für eine Eingabe und eine erwartete Ausgabe?

EDIT: Ach, kann es sein, dass Du ausgeben willst, dass es vom soundsovielten bis zum soundsovielten eben 2 Jahre, 3 Monate und 5 Tage sind?

Java:
public void zeigeJahreMonateTage(LocalDate von, LocalDate bis) {
    Period period = Period.between(von, bis);
    System.out.printf("%d Jahre, %d Monate und %d Tage", period.getYears(), period.getMonths(), period.getDays());
}
 
Zuletzt bearbeitet:

triade

Aktives Mitglied
Hast Du ein Beispiel für eine Eingabe und eine erwartete Ausgabe?

EDIT: Ach, kann es sein, dass Du ausgeben willst, dass es vom soundsovielten bis zum soundsovielten eben 2 Jahre, 3 Monate und 5 Tage sind?

Java:
public
[/QUOTE]
[QUOTE="mihe7, post: 1349709, member: 58041"]
EDIT: Ach, kann es sein, dass Du ausgeben willst, dass es vom soundsovielten bis zum soundsovielten eben 2 Jahre, 3 Monate und 5 Tage sind?
[/QUOTE]
Hast Du ein Beispiel für eine Eingabe und eine erwartete Ausgabe?

EDIT: Ach, kann es sein, dass Du ausgeben willst, dass es vom soundsovielten bis zum soundsovielten eben 2 Jahre, 3 Monate und 5 Tage sind?

Java:
public void zeigeJahreMonateTage(LocalDate von, LocalDate bis) {
    Period period = Period.between(von, bis);
    System.out.printf("%d Jahre, %d Monate und %d Tage", period.getYears(), period.getMonths(), period.getDays());
}
Ja das wäre wie ich es noch ergänzen möchte vielen dank.🙏
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
javapingu Endlosschleife bei User Input mit try Scanner Java Basics - Anfänger-Themen 7
JD_1998 Vektorrechner; User Input -> Index out of bounds Java Basics - Anfänger-Themen 3
C Wie kann ich einen User Input mit einer If-Anweisung verbinden? Java Basics - Anfänger-Themen 5
R User Input wird übersprungen?! Java Basics - Anfänger-Themen 17
W User zwischen Optionen wählen lassen Java Basics - Anfänger-Themen 1
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
R Wie überprüfen wann der User online oder offline ist? Java Basics - Anfänger-Themen 5
B Import Tabelle - Struktur durch User einstellbar Java Basics - Anfänger-Themen 4
I gemeinsame Config-Datei für alle Windows-User Java Basics - Anfänger-Themen 5
J Dateien für anderen User "mitgeben" Java Basics - Anfänger-Themen 1
M "Per-User"-Variable Java Basics - Anfänger-Themen 2
P Ein Array mit der Eingaber der User füllen und ausgeben Java Basics - Anfänger-Themen 6
Z User/passwort eingabe...Help! Java Basics - Anfänger-Themen 4
J Array manuell vom User eingeben, Zeilenweise Java Basics - Anfänger-Themen 2
N User Eingabe mit Zeile aus TextFile vergleichen Java Basics - Anfänger-Themen 13
H Erste Schritte 2 User Interfaces für eine Anwendung Java Basics - Anfänger-Themen 7
S Input/Output Welche Möglichkeiten Eingabe von User abfragen Java Basics - Anfänger-Themen 5
D User - Interface über die Console Java Basics - Anfänger-Themen 14
N User wechseln? Java Basics - Anfänger-Themen 3
3 User erstellen / Oracle Content DB Java Basics - Anfänger-Themen 2
G Startmenü und user.dir Java Basics - Anfänger-Themen 14
P System.getProperty("user.dir") beeinflussen Java Basics - Anfänger-Themen 3
kulturfenster User soll Radius von Kugel bestimmen Java Basics - Anfänger-Themen 4
K User Aktivität überwachen Java Basics - Anfänger-Themen 9
I User anlegen und Sytempfade zuordnen Java Basics - Anfänger-Themen 4
I Wie kann man in root -User wechseln? Java Basics - Anfänger-Themen 16
S Windows User != Server User auslesen Java Basics - Anfänger-Themen 19
H Dienst beenden als normaler User Java Basics - Anfänger-Themen 3
X Property user.name über Konsole verändern Java Basics - Anfänger-Themen 6
M JTable Zellen für User sperren Java Basics - Anfänger-Themen 4
M Scanner Input mit if überprüfen Java Basics - Anfänger-Themen 5
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
schemil053 Multithread - Input verrutscht während etwas ausgegeben wird Java Basics - Anfänger-Themen 6
S String mit Int input vergleichen Java Basics - Anfänger-Themen 5
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
I Array übernimmt immer den letzten Input. Java Basics - Anfänger-Themen 14
L Wie Input auf verschiedene Kriterien hin überprüfen? Java Basics - Anfänger-Themen 3
D Input/Output Input von zwei Koordinaten validieren und anschließend Werte speichern Java Basics - Anfänger-Themen 7
J Sharing Audio input Java Basics - Anfänger-Themen 6
J Fragen zu Input/Output Java Basics - Anfänger-Themen 3
steven789hjk543 Input mit if-else Java Basics - Anfänger-Themen 23
O Input/Output newbile und keine Ahnung! Java Basics - Anfänger-Themen 16
D [AES] input not multiple of 16 Java Basics - Anfänger-Themen 2
J Input/Output Input als Parameter an Methoden übergeben Java Basics - Anfänger-Themen 23
J Input-Variable nicht sichtbar Java Basics - Anfänger-Themen 2
T '>' vor Console input Java Basics - Anfänger-Themen 3
J Input/Output Input Buttons Html mit JSP Java Basics - Anfänger-Themen 3
S Tastatur input lesen Java Basics - Anfänger-Themen 7
I Datentypen input.nextCharAt(0) wirft einen Fehler Java Basics - Anfänger-Themen 3
J Input/Output Scanner Input als etwas einsetzen Java Basics - Anfänger-Themen 3
H Methode mit späterem Input Java Basics - Anfänger-Themen 3
S Input/Output Doppelte Input-Abfrage Java Basics - Anfänger-Themen 3
S Input/Output Programm läuft nach input-Abfrage nicht weiter. Java Basics - Anfänger-Themen 2
T Java Input Java Basics - Anfänger-Themen 6
GoldenShadow Input/Output Verschiedene Versionen von Input/Output Java Basics - Anfänger-Themen 3
S LinkedList mit Input vergleichen. Java Basics - Anfänger-Themen 5
A Input/Output Input eingabe in unicode übersetzen Java Basics - Anfänger-Themen 3
N Input/Output Wenn kein Input, dann Fehler anzeigen lassen im JFrame Java Basics - Anfänger-Themen 6
L JTextField/Listener Input Problem Java Basics - Anfänger-Themen 2
O OOP Input & Output in der GUI-Programmierung Java Basics - Anfänger-Themen 2
C Input & Output Frage Java Basics - Anfänger-Themen 4
E Input & Output Problem Java Basics - Anfänger-Themen 7
F z = input.nextChar(); PROBLEM Taschenrechner Java Basics - Anfänger-Themen 7
A Input/Output Input überprüfen und weiterverarbeiten Java Basics - Anfänger-Themen 10
C Vector erzeugt neue Indizes nach Input Java Basics - Anfänger-Themen 2
B do while (input = zahl) Java Basics - Anfänger-Themen 6
H Text ausdrucken, den ich entweder direkt in die Kommandozeile schreibe, oder über input redirect übe Java Basics - Anfänger-Themen 2
S Input/Output Data-Input/Output-Stream Java Basics - Anfänger-Themen 2
M Kontaktbuch - Probleme beim Input Java Basics - Anfänger-Themen 3
M Output Input im Cmd Fenster Java Basics - Anfänger-Themen 7
S Input (Blutiger Anfänger) Java Basics - Anfänger-Themen 18
P HTML <input> Feld in einem JLabel auslesen Java Basics - Anfänger-Themen 4
A HSSFWorkbook als Return-Wert für Input in andere Methode Java Basics - Anfänger-Themen 5
S Arrays - Fehler bei der Verarbeitung: For input string: "Berlin" Java Basics - Anfänger-Themen 14
B NumberFormatException: For input string: "" Java Basics - Anfänger-Themen 4
C OOP Java Projekt Bankautomat input fehler Java Basics - Anfänger-Themen 14
D Input Output Java Basics - Anfänger-Themen 8
Spin IllegalArgumentException Input == null Java Basics - Anfänger-Themen 7
N Probleme mit Input/OutputStreams, Daten im Speicher verwalte Java Basics - Anfänger-Themen 2
D Input Scanner Java Basics - Anfänger-Themen 9
F Java login & input (html). Java Basics - Anfänger-Themen 4
N Verschiedene Input/Output Klassen Java Basics - Anfänger-Themen 3
F Verwenden von Input innerhalb eines Applets Java Basics - Anfänger-Themen 3
L StdIn Stdout / Input Output Aufgabe Java Basics - Anfänger-Themen 3
M Input/Output Stream aus einem String Java Basics - Anfänger-Themen 2
G Input Dialog Problem Java Basics - Anfänger-Themen 11
F Input kann nicht verglichen werden Java Basics - Anfänger-Themen 6
J File Input/Output und Applet Java Basics - Anfänger-Themen 2
M FTP-Verbindung mit Apache Commons Net Java Basics - Anfänger-Themen 5
D Verbindung zu xampp Java Basics - Anfänger-Themen 4
C SFTP Verbindung nicht möglich Java Basics - Anfänger-Themen 4
G Socket Verbindung aufbauen Java Basics - Anfänger-Themen 11
I Best Practice Saubere Verbindung zwischen API und Business Layer mit DTO's Java Basics - Anfänger-Themen 2
B Quicksort in Verbindung mit einem Projekt Java Basics - Anfänger-Themen 1
S Verbindung von einer Excel Datei zu Java-- Java Basics - Anfänger-Themen 4
R Error, wenn mehrere Clients gleichzeitig die Verbindung beenden Java Basics - Anfänger-Themen 16
R Keine Verbindung mit MariaDB Java Basics - Anfänger-Themen 18
M Datenbank verbindung Java Basics - Anfänger-Themen 19
J Java Verbindung mit mysql Datenbank Java Basics - Anfänger-Themen 3
R Keine Verbindung zu MySql über Netbeans Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben