Guten Tag zusammen.
Ich nutze aktuell die neue Date Api von Java 8. Sehr schön gemacht das Ding… Ich möchte anhand eines Strings ein Datum erstellen um danach die Differenz zwischen zwei Zeiten zu haben.
Das funktioniert alles wunderbar mit diesem Code:
Instant ende_8 = Instant.parse("2014-04-21T"+"12:00"+":00Z");
long diffAsMinutes = ChronoUnit.MINUTES.between(begin_8, ende_8);
long diff_stunden = diffAsMinutes / 60;
long diff_minuten = diffAsMinutes % 60;
System.out.println("Differenz in Stunden Java 8: " + diff_stunden + " in Minuten: " + diff_minuten);```
Zu Ausgabezwecken brauche ich Stunden und Minuten getrennt. Ich kann mir jedoch nicht vorstellen, das es die einzige möglich ist dies mit dem Modulo befehl zu machen?
Ich finde leider keine andere Erklärung wie dies mit der Api gehen sollte??
Vielen Dank schonmal
Sieh dir mal die Java Docs zur Klasse [japi]DateTimeFormatter[/japi] an. Unter “Patterns for Formatting and Parsing” hast du ein Beispiel.
*** Edit ***
Sry, habe deinen Beitrag nicht richtig gelesen. Mit dem DateTimeFormatter kannst du nur Daten / Zeiten formatieren. Bei Intervallen hilft er dir nicht.
Mit [japi]Duration[/japi] braucht man aber auch den Modulus, zumindest habe ich keinen Formatter dafür gefunden.
Das hier kommt deinen Vorstellungen vielleicht am nächsten:
System.out.println(diff.toHours() + " hour, " + diff.toMinutes() % 60 + " minutes");```
Ich habe es jetzt für den Moment genau so gelöst. Funktioniert wunderbar.
Vielleicht finde ich in Zukunft ja noch eine bessere oder noch einfachere Methode.
Gruss
Kriecht man ein wenig in der API umher sieht man das der DateTimeFormatter zumindest eine LocalTime übernimmt. Wir können also so tun als ob die Dauer in Stunden, Minuten ein Zeitpunkt an einem beliebigen Tag wäre. Geht aber leider nur für max 24h-Differenz ;). Alternativ arithmetisch die Teile ermitteln. Zumindest ist das alles ohne Modulo, aber ob ich das schön finde sei mal dahingestellt.
Davon abgesehen, wenn man sich nicht an dem seltsamen Format stößt kann man auch die normale Ausgabe der Duration verwenden, im Beispiel unten wäre das PT5H1M. Leider ist die gröbste Einheit der Ausgabe die Stunde, das wiederrum nicht deckungsgleich zum Parsen läuft, dort gibt es “Formatstrings” für Tage.
Und überhaupt, die ganzen einheitlichen Konstanten z.B. für die Anzahl von Minuten pro Stunde etc. sind alle schön package private in LocalTime verbastelt, manchmal fragt man sich wirklich…
Instant begin_8 = Instant.parse("2014-04-21T" + "07:00" + ":00Z");
Instant ende_8 = Instant.parse("2014-04-21T"+"12:01"+":00Z");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
Duration duration = Duration.between(begin_8, ende_8);
System.out.println(duration); //PT5H1M
System.out.println(LocalTime.ofNanoOfDay(duration.toNanos()).format(formatter));
//alternativ
System.out.println(duration.toHours()+":"+duration.minusHours(duration.toHours()).toMinutes());
Wenn man keinen Formatter verwendet, muss man ggf. noch den Fall der führenden Null bei den Minuten abfangen. Das ist in @ThreadPool s letztem Beispiel und auch in meinem Code nicht abgebildet.