diff --git a/src/ChatGPT.txt b/src/ChatGPT.txt index 2d35108..0d62e8d 100644 --- a/src/ChatGPT.txt +++ b/src/ChatGPT.txt @@ -38,4 +38,70 @@ Frage 2: Beispiel: Math.ceil(2.1); // Ausgabe: 3.0 Math.ceil(3.7); // Ausgabe: 4.0 - Math.ceil(1.01); // Ausgabe: 2.0 \ No newline at end of file + Math.ceil(1.01); // Ausgabe: 2.0 + +------------------------------------------------------------------------------------------------------------------- +Frage 3: + Ich : die Methode getTime gibt die Zeit in stunden und Minuten?? + ChatGPT: + Die Methode getTime() in Java gibt nicht direkt die Stunden und Minuten aus. Stattdessen gibt sie die Zeit als Anzahl der Millisekunden seit dem 1. Januar 1970, 00:00:00 UTC zurück (Unix-Zeit). Du kannst diese Millisekunden dann verwenden, um die Differenz zwischen zwei Date-Objekten zu berechnen, wie in deinem Fall geschehen. + +Um explizit die Stunden und Minuten aus einem Date-Objekt zu bekommen, kannst du entweder die Calendar-Klasse oder die SimpleDateFormat-Klasse verwenden. Hier sind zwei Möglichkeiten: + +1. Mit Calendar +java +Code kopieren +Calendar cal = Calendar.getInstance(); +cal.setTime(deinDateObjekt); +int stunden = cal.get(Calendar.HOUR_OF_DAY); // Stunden im 24-Stunden-Format +int minuten = cal.get(Calendar.MINUTE); // Minuten +2. Mit SimpleDateFormat +Falls du die Stunden und Minuten als String brauchst, kannst du SimpleDateFormat benutzen: + +java +Code kopieren +SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); +String zeit = sdf.format(deinDateObjekt); // Zeit als String "HH:mm" +Zusammengefasst: +getTime() gibt die Millisekunden seit 1970 zurück, nicht direkt Stunden und Minuten. +Um Stunden und Minuten zu extrahieren, musst du entweder Calendar verwenden oder die Ausgabe mit SimpleDateFormat formatieren. +In deinem Fall, wenn du die Stunden und Minuten für Ein- und Ausfahrt benötigst, würde ich dir empfehlen, entweder Calendar zu verwenden oder mit SimpleDateFormat die Zeit zu formatieren, um Klarheit zu schaffen. +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Frage 4: + Ich: var sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); + Date d1 = sdf.parse("01.10.2024, 14:00"); + Date d2 = sdf.parse("01.10.2024, 15:30"); + + System.out.println( d1.getHours()); +warum wurde die Methode .getHours() durchgestrichen ?? + + cahtGPT: Die Methode getHours() der Klasse Date ist durchgestrichen, weil sie als veraltet (deprecated) gilt. Java hat entschieden, diese Methode zu entwerten, weil die Date-Klasse in ihrer ursprünglichen Form als unflexibel und fehleranfällig angesehen wurde. Stattdessen empfiehlt Java, modernere Klassen wie Calendar oder die Klassen aus dem java.time-Paket (z. B. LocalDateTime, ZonedDateTime) zu verwenden. + +Die veralteten Methoden wie getHours(), getMinutes(), und getSeconds() wurden durch leistungsfähigere und flexiblere APIs ersetzt, die besser mit Zeitzonen und Internationalisierung umgehen können. + +Alternative Lösung: +Anstatt getHours() zu verwenden, solltest du Calendar oder die neuen Zeit-API-Klassen verwenden. Hier ist eine Möglichkeit, die Stunde mithilfe von Calendar zu bekommen: + +Mit Calendar: +java +Code kopieren +SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); +Date d1 = sdf.parse("01.10.2024, 14:00"); + +Calendar cal = Calendar.getInstance(); +cal.setTime(d1); +int hours = cal.get(Calendar.HOUR_OF_DAY); // Stunden im 24-Stunden-Format + +System.out.println(hours); // Ausgabe: 14 +Mit java.time.LocalDateTime (empfohlene Methode ab Java 8): +Java 8 und höher bietet das java.time-Paket, das viel leistungsfähiger ist und besser mit Datum und Zeit umgeht. + +java +Code kopieren +DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy, HH:mm"); +LocalDateTime dateTime = LocalDateTime.parse("01.10.2024, 14:00", formatter); + +int hours = dateTime.getHour(); +System.out.println(hours); // Ausgabe: 14 +Fazit: +Vermeide die Verwendung der veralteten getHours()-Methode und nutze entweder Calendar oder, noch besser, die java.time-API, die in Java 8 \ No newline at end of file diff --git a/src/Parkhaus/Fahrzeug.java b/src/Parkhaus/Fahrzeug.java index 524ff82..f75b83a 100644 --- a/src/Parkhaus/Fahrzeug.java +++ b/src/Parkhaus/Fahrzeug.java @@ -14,7 +14,7 @@ import java.util.Date; public class Fahrzeug { private final String kennzeichen; - private final Date einfahrt; + private Date einfahrt; private Date ausfahrt; private boolean bezahlt; private int betrag; diff --git a/src/Parkhaus/Gebuehrenberechnen.java b/src/Parkhaus/Gebuehrenberechnen.java deleted file mode 100644 index 27ff4f3..0000000 --- a/src/Parkhaus/Gebuehrenberechnen.java +++ /dev/null @@ -1,7 +0,0 @@ -package Parkhaus; - -public class Gebuehrenberechnen { - - // Hier werde ich die Parkgebühren behandlen - -} diff --git a/src/Parkhaus/JTest_Einfahren.java b/src/Parkhaus/JTest_Einfahren.java index ca5d089..e3d2ced 100644 --- a/src/Parkhaus/JTest_Einfahren.java +++ b/src/Parkhaus/JTest_Einfahren.java @@ -15,7 +15,7 @@ class JTest_Einfahren { @Test public void testEinfahrenOhneEingabe() throws ParseException { - parkhaus.einfahrenextern("", ""); + parkhaus.einfahren("", ""); assertEquals(179, parkhaus.getMaxPlaetze()); } @@ -23,8 +23,7 @@ class JTest_Einfahren { public void testEinfahrenMitEingabe() throws ParseException { String kennzeichen = "MA-SH 4077"; String einfahrtzeit = "01.10.2024, 14:30"; - - String test = parkhaus.einfahrenextern(kennzeichen, einfahrtzeit); + String test = parkhaus.einfahren(kennzeichen, einfahrtzeit); assertTrue(test.contains(kennzeichen)); assertTrue(test.contains(einfahrtzeit)); assertEquals(179, parkhaus.getMaxPlaetze()); diff --git a/src/Parkhaus/JTest_berechneParkgebuehren.java b/src/Parkhaus/JTest_berechneParkgebuehren.java new file mode 100644 index 0000000..70e1e38 --- /dev/null +++ b/src/Parkhaus/JTest_berechneParkgebuehren.java @@ -0,0 +1,59 @@ +package Parkhaus; + +import static org.junit.jupiter.api.Assertions.*; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class JTest_berechneParkgebuehren { + + private Parkhaus parkhaus; + private SimpleDateFormat sdf; + @BeforeEach + void start() throws ParseException { + parkhaus = new Parkhaus(); + sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); + } + + @Test + public void test_berechneParkgebuehren() throws ParseException, AutoNichtGefundenException { + String kennzeichen = "MA-SH 4077"; + String einfahrt = "01.10.2024, 14:30"; + String ausfahrt = "01.10.2024, 14:45"; + parkhaus.einfahren(kennzeichen, einfahrt); + + // 15 Minuten => True + assertEquals(0,parkhaus.berechneParkgebuehren(kennzeichen, ausfahrt)); + + // 16 Minuten => True + einfahrt = "01.10.2024, 14:30"; + ausfahrt = "01.10.2024, 14:46"; + assertEquals(1,parkhaus.berechneParkgebuehren(kennzeichen, ausfahrt)); + + // 1 Stunde => True + einfahrt = "01.10.2024, 14:30"; + ausfahrt = "01.10.2024, 15:30"; + assertEquals(1, parkhaus.berechneParkgebuehren(kennzeichen, ausfahrt)); + + + + // 2 Stunden => True + einfahrt = "01.10.2024, 14:00"; + ausfahrt = "01.10.2024, 16:00"; + assertEquals(2, parkhaus.berechneParkgebuehren(kennzeichen, ausfahrt)); + + // Zwischen 20 bis 6 Uhr => True + einfahrt = "01.10.2024, 22:00"; + ausfahrt = "02.10.2024, 04:00"; + assertEquals(5, parkhaus.berechneParkgebuehren(kennzeichen, ausfahrt)); + + + } + + + +} diff --git a/src/Parkhaus/Main.java b/src/Parkhaus/Main.java index 02c8e49..8419650 100644 --- a/src/Parkhaus/Main.java +++ b/src/Parkhaus/Main.java @@ -1,11 +1,18 @@ package Parkhaus; import java.text.ParseException; - +import java.text.SimpleDateFormat; +import java.util.Date; public class Main { - public static void main(String[] args) throws ParseException { - new TextUI(); + public static void main(String[] args) throws ParseException, AutoNichtGefundenException { + + var sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); + Date d1 = sdf.parse("01.10.2024, 14:00"); + Date d2 = sdf.parse("01.10.2024, 15:30"); + + + System.out.println( d1.getHours()); } } diff --git a/src/Parkhaus/Parkhaus.java b/src/Parkhaus/Parkhaus.java index 162d629..7930204 100644 --- a/src/Parkhaus/Parkhaus.java +++ b/src/Parkhaus/Parkhaus.java @@ -3,6 +3,7 @@ package Parkhaus; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; /* Parkhaus klasse @@ -23,7 +24,7 @@ public class Parkhaus { sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); } - private String einfahrenIntern(String kennzeichen, String einfahrtzeit) throws ParseException { + public String einfahren(String kennzeichen, String einfahrtzeit) throws ParseException { Date einfahrt; Fahrzeug fahrzeug; if (kennzeichen.isEmpty() && einfahrtzeit.isEmpty()) @@ -41,56 +42,78 @@ public class Parkhaus { return "Das Fahrzeug mit dem Kennzeichen: " + fahrzeug.getKennzeichen() + "\n" + "wurde um: " + fahrzeug.getEinfahrtFormatted() + " im Parkhaus eingefahren."; } - - public String einfahrenextern(String kennzeichen, String einfahrtzeit) throws ParseException { - - return einfahrenIntern(kennzeichen, einfahrtzeit); - } - - private int berechneParkgebuehrenIntern(String kennzeichen, String ausfahrtzeit)throws AutoNichtGefundenException, ParseException { - Fahrzeug fahrzeug = findeFahrzeug(kennzeichen); - Date ausfahrt = sdf.parse(ausfahrtzeit); - Date einfahrt = fahrzeug.getEinfahrt(); - - long inMinuten = ((ausfahrt.getTime() - einfahrt.getTime()) / 1000 / 60); - int inStunden = (int) Math.ceil(inMinuten / 60); // Z.b = 6 Stunden - int maxNachtBetrag = 5; - int maxTagBetrag = 15; - int betrag; - - if (inMinuten <= 15) - betrag = 0; - - - // zwische 20 Uhr und 6 Uhr max 5€ - else if (einfahrt.getHours() >= 20 || einfahrt.getHours() < 6 || ausfahrt.getHours() >= 20|| ausfahrt.getHours() < 6) - betrag = Math.min(inStunden, maxNachtBetrag); - - else { - betrag = inStunden; - - if (betrag > maxTagBetrag) - betrag = maxTagBetrag; - } - - fahrzeug.setBetrag(betrag); - return fahrzeug.getBetrag(); - - } - - public int berechneParkgebuehrenExtern(String kennzeichen, String ausfahrtzeit) throws AutoNichtGefundenException, ParseException { - int betrag = berechneParkgebuehrenIntern(kennzeichen, ausfahrtzeit); - return betrag; - } + public int berechneParkgebuehren(String kennzeichen, String ausfahrtzeit) throws AutoNichtGefundenException, ParseException { + if (kennzeichen.isEmpty()) { + throw new AutoNichtGefundenException("Sie müssen bitte das Kennzeichen Ihres Autos eingeben."); + } + + Fahrzeug fahrzeug = findeFahrzeug(kennzeichen); + Date einfahrt = fahrzeug.getEinfahrt(); + Date ausfahrt; + + if (ausfahrtzeit.isEmpty()) { + String aktuelleZeitString = sdf.format(new Date()); + ausfahrt = sdf.parse(aktuelleZeitString); + } else { + ausfahrt = sdf.parse(ausfahrtzeit); + } + + double inMinuten = (ausfahrt.getTime() - einfahrt.getTime()) / 1000.0 / 60.0; + int inStunden = (int) Math.ceil(inMinuten / 60.0); + int maxNachtBetrag = 5; + int maxTagBetrag = 15; + int betrag = 0; + + // Erstellung von Calendar-Objekten für Einfahrt und Ausfahrt + Calendar calEinfahrt = Calendar.getInstance(); + calEinfahrt.setTime(einfahrt); + + Calendar calAusfahrt = Calendar.getInstance(); + calAusfahrt.setTime(ausfahrt); + + int einfahrtStunde = calEinfahrt.get(Calendar.HOUR_OF_DAY); + int ausfahrtStunde = calAusfahrt.get(Calendar.HOUR_OF_DAY); + + if (inMinuten <= 15) + betrag = 0; + + else if ((einfahrtStunde < 6 || einfahrtStunde >= 20) || (ausfahrtStunde < 6 || ausfahrtStunde >= 20)) { + betrag = (inStunden <= maxNachtBetrag) ? inStunden : maxNachtBetrag; + System.out.println(betrag); + } + + + else { + betrag = inStunden; + if (betrag > maxTagBetrag) { + betrag = maxTagBetrag; + } + } + + fahrzeug.setBetrag(betrag); + return fahrzeug.getBetrag(); + } + + + private Fahrzeug findeFahrzeug(String kennzeichen) throws AutoNichtGefundenException { + + for (Fahrzeug auto : fahrzeuge) + if (auto.getKennzeichen().equals(kennzeichen)) + return auto; + + throw new AutoNichtGefundenException("Ihr Auto wurde nicht gefunden. Bitte wenden Sie sich an den Support"); + + } + public boolean checkParkplatze() { return maxPlaetze > 0; } - private boolean checkSchulden(String kennzeichen) { + public boolean checkSchulden(String kennzeichen) { for (Fahrzeug sc : fahrzeugeMitSchulden) if (sc.getKennzeichen().equals(kennzeichen)) return true; @@ -98,20 +121,6 @@ public class Parkhaus { return false; } - public boolean checkSchuldenExtern(String kennzeichen) { - return checkSchulden(kennzeichen); - } - - public Fahrzeug findeFahrzeug(String kennzeichen) throws AutoNichtGefundenException { - - for (Fahrzeug auto : fahrzeuge) - if (auto.getKennzeichen().equals(kennzeichen)) - return auto; - - throw new AutoNichtGefundenException("Ihre Auto wurde nicht gefunden \n melden Sie sich bitte an die Support"); - - } - // Getter methoden: public ArrayList getFahrzeuge() { return fahrzeuge; diff --git a/src/Parkhaus/TextUI.java b/src/Parkhaus/TextUI.java index dea0287..c719ad1 100644 --- a/src/Parkhaus/TextUI.java +++ b/src/Parkhaus/TextUI.java @@ -5,16 +5,14 @@ import java.util.Scanner; public class TextUI { private Parkhaus system; - private Scanner eingabe; - - TextUI() throws ParseException{ + TextUI() throws ParseException, AutoNichtGefundenException{ system = new Parkhaus(); startprogramm(); } - private void startprogramm() throws ParseException { - eingabe = new Scanner(System.in); + private void startprogramm() throws ParseException, AutoNichtGefundenException { + Scanner eingabe = new Scanner(System.in); boolean aktiv = true; System.out.println("<> "); @@ -22,15 +20,16 @@ public class TextUI { System.out.println(); System.out.println("Bitte Wählen Sie ein Option ein: "); System.out.println("1.Einfahren"); - System.out.println("2.Ausfahren"); - System.out.println("3. Parkgebühren berechnen und (bezahlen Oder Schulden lassen)"); - System.out.println("4. Beenden"); + System.out.println("2. Parkgebühren berechnen lassen"); + System.out.println("3. Parkgebühren bezahlen"); + System.out.println("4.Ausfahren"); + System.out.println("5. Beenden"); System.out.print("> "); String auswhal = eingabe.nextLine(); String kennzeichen; String einfahrtzeit; - + String ausfahrtzeit; switch (auswhal) { case "1": // Einfahren if (!system.checkParkplatze()) @@ -38,23 +37,31 @@ public class TextUI { else { System.out.println("geben Sie bitte das Kennzeichen Ihres Autos ein (optional): "); kennzeichen = eingabe.nextLine(); - if (system.checkSchuldenExtern(kennzeichen)) + if (system.checkSchulden(kennzeichen)) System.out.println("Das Auto mit dem Kennzeichen: " + kennzeichen + " ist im Parkhaus mit Schulden eingefahren!" ); - System.out.println("geben Sie nun bitte die Einfahrtszeit ein (Optional):"); + System.out.println("geben Sie nun bitte die Einfahrtszeit ein (oder lassen Sie das für das System):"); einfahrtzeit = eingabe.nextLine(); - System.out.println(system.einfahrenextern(kennzeichen, einfahrtzeit)); + System.out.println(system.einfahren(kennzeichen, einfahrtzeit)); } - break; case "2": - // TODO - + System.out.println("Geben Sie erneut das Kennzeichnes Ihres Autos an"); + kennzeichen = eingabe.nextLine(); + System.out.println("Geben Sie bitte die Ausfahrtzeit ein (oder lassen Sie das für das System)"); + ausfahrtzeit = eingabe.nextLine(); + system.berechneParkgebuehren(kennzeichen, ausfahrtzeit); + break; case "3": // TODO + break; case "4": // TODO - + break; + + case "5": + break; + default: System.out.println("Das war leider keine gültige Eingabe"); diff --git a/src/Parkhaus/kennzeichenzufaelliggenerieren.java b/src/Parkhaus/kennzeichenzufaelliggenerieren.java index a9d57fe..9e530d2 100644 --- a/src/Parkhaus/kennzeichenzufaelliggenerieren.java +++ b/src/Parkhaus/kennzeichenzufaelliggenerieren.java @@ -1,16 +1,20 @@ package Parkhaus; import java.util.ArrayList; +import java.util.HashSet; import java.util.Random; +import java.util.Set; /*kennzeichenzufaelliggenerieren: * * - Diese Klasse hat nur die Aufgabe, zufällige Kennzeichen zu generieren * - immer wenn diese Klasse ein zufälliges Kennzeichen generiert, - * - speichere ich das,damit es nicht für mehrere Autos dasselbe Kennzeichen generiert. + * - Hashset verwenden, damit das System nicht für mehrere Autos dasselbe Kennzeichen generiert + */ public class kennzeichenzufaelliggenerieren { - private static final ArrayList speichereEindutigeNummern = new ArrayList<>(); + // Keine Duplikate + private static Set speichereEindutigeNummern = new HashSet<>(); private static final String[] ersteZweiZeichen = { "MA", "HD", "KA", "FF", "ROK", "BW", "HH", "B", "D" }; private static final String[] zweiteZweizeichen = { "ME", "SH", "DF", "KC", "FT", "GH", "OM", "KL", "CV" }; private static String eindutigeZahlen = ""; @@ -22,20 +26,16 @@ public class kennzeichenzufaelliggenerieren { zufaelligeKennzeichen = ersteZweiZeichen[random.nextInt(ersteZweiZeichen.length)]; zufaelligeKennzeichen += "-" + zweiteZweizeichen[random.nextInt(zweiteZweizeichen.length)] + " "; - while (true) { + do { eindutigeZahlen = ""; for (int i = 1; i <= 4; i++) eindutigeZahlen += random.nextInt(10); - if (!checkEindutigeZeichen()) - continue; - - speichereEindutigeNummern.add(eindutigeZahlen); - break; - } - + } while (speichereEindutigeNummern.contains(eindutigeZahlen)); + + speichereEindutigeNummern.add(eindutigeZahlen); zufaelligeKennzeichen += eindutigeZahlen; - + if (random.nextBoolean()) zufaelligeKennzeichen += "E"; @@ -43,12 +43,4 @@ public class kennzeichenzufaelliggenerieren { } - public static boolean checkEindutigeZeichen() { - for (String s : speichereEindutigeNummern) - if (s.equals(eindutigeZahlen)) - return false; - - return true; - - } } \ No newline at end of file