Methoden Calendar/Date Countdown

missy72

Bekanntes Mitglied
Hallo,

ich möchte einen Countdown erstellen und arbeite mit zwei Calendar-Objekten.
Über die Date-Funktion möchte ich das Delta errechnen. Scheint so aber nicht zu funktionieren.

Meine 1. Frage; gibt es ein Bug bei der Erstellung des GregorianCalender? Augenmerk auf den Monat!
Warum zählt man nur den Monat von 0 bis 11?
[CODE lang="java" title="Java"] Calendar nextStartCalendar = new GregorianCalendar(2021, 2, 26, 20, 47, 0);[/CODE]
[CODE lang="java" title="Konsole"]Fri Mar 26 20:47:00 CET 2021[/CODE]

2.Frage; warum weicht das Delta um eine Stunde ab. War auch schon mal nur 59min. Es gibt kein zuverlässiges Ergebnis.
Darf und Kann man mein Problem überhaupt so lösen?
[CODE lang="java" title="Java"]Date counterDate = new Date ( startTimeDate.getTime() - timeNowDate.getTime());[/CODE]
[CODE lang="java" title="Konsole"]20:55:50
22:15:15
02:19:25[/CODE]
und müsste die Methode nicht 0 ergeben?
[CODE lang="java" title="Java"]Date counterDate = new Date ( startTimeDate.getTime() - startTimeDate.getTime());[/CODE]
[CODE lang="java" title="Konsole"]01:00:00[/CODE]

Ich denke, dass viele Programme eine entsprechene Funktion benötigen, aber irgenwie habe ich noch nicht so das richtige im Netz gefunden.
Um Unterstützung wäre ich dankbar

MfG MB
 
Der Grund warum ich Calendar benutze ist, weil ich es nicht besser weiß.
Und das mit in den Fuß schießen habe ich gemerkt. Kommt ja nur Blödsinn dabei raus.
Zeitzonen sind bei beiden Kalender gleich.
[CODE lang="java" title="Konsole"]Fri Feb 26 21:01:58 CET 2021
Fri Mar 26 22:15:15 CET 2021[/CODE]

Dann schau ich mal was ich so im Netz finde wegen der LocalDateTime.
Da habe ich wenigstens eine Richtung, in welche ich mich bewegen kann.

Vielen Dank.
 
Meine 1. Frage; gibt es ein Bug bei der Erstellung des GregorianCalender? Augenmerk auf den Monat!
Warum zählt man nur den Monat von 0 bis 11?
Weil die API damals so erstellt wurde.
2.Frage; warum weicht das Delta um eine Stunde ab. War auch schon mal nur 59min. Es gibt kein zuverlässiges Ergebnis.
Darf und Kann man mein Problem überhaupt so lösen?
Die Antwort ist: Kommt darauf an...
Wie erstellst du "startTimeDate" und "timeNowDate"? Vermutlich weicht es dabei schon um die Zeitzone ab. "getTime" liefert dir den UNIX-Zeitstempel, dieser ist immer UTC.

Also idealerweise verwendest du "java.time" Klassen, wie "LocalDateTime" und "OffsetDateTime". Das ist eine neue API welche in Java 8 hinzugekommen ist und so ziemlich alle Probleme mit Zeitzonen etc. beseitigt. Im ersten Moment ist sie etwas klobiger zu handhaben, aber wenn man sich einmal in Datum, Zeit und Zeitzonen eingelesen hat, versteht man wieso dem so ist (Hinweis: Es ist furchtbar).

Beispiel wie du den Unterschied zwischen zwei "OffsetDateTime" bekommst:

Java:
OffsetDateTime firstDateTime = OffsetDateTime.now();
OffsetDateTime secondDateTime = OffsetDateTime.now();

long differenceInHours = ChronoUnit.HOURS.between(firstDateTime, secondDateTime);

Je nachdem mit was fuer Daten du handierst, reicht dir vermutlich "LocalDateTime", welches keine Zeitzone beachtet.
 
Für die Nachwelt und die Suchenden , meine Lösung.
Danke noch mal.

[CODE lang="java" title="Java"] LocalDate nowDate = LocalDate.now();
LocalTime nowTime = LocalTime.now();
LocalTime startTime = LocalTime.of(23, 30, 0);
long countDownVariable = Duration.between (nowTime, startTime).getSeconds();
LocalTime countDown = LocalTime.ofSecondOfDay(countDownVariable);

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yy");
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");

System.out.println("" + dateFormatter.format(nowDate));
System.out.println("" + timeFormatter.format(nowTime));
System.out.println("" + timeFormatter.format(startTime));
System.out.println("" + timeFormatter.format(countDown));[/CODE]
[CODE lang="java" title="Konsole"]Datum 26.02.21
Uhrzeit 22:38:18
Startzeit 23:30:00
Delta 00:51:41[/CODE]
 
Statt LocalTime für die Dauer zu „missbrauchen“ kannst du besser direkt Duration nutzen, ohne das vorher in Sekunden umzuwandeln 🙂
 
Statt LocalTime für die Dauer zu „missbrauchen“ kannst du besser direkt Duration nutzen, ohne das vorher in Sekunden umzuwandeln 🙂
Das habe ich jetzt nicht verstanden.
Am Ende möchte ich alle vier Werte über je ein Label visualisieren.
1614377169410.png

PS: Im nächsten Step lasse ich den Countdown ablaufen und die Uhrzeit dynmisch anzeigen.
 
ist mir vorhin gar nicht aufgefallen. Dem Countdown fehlt eine Sekunde.
Wie kommt denn das jetzt schon wieder? Aber man kann ja nicht immer alles hinterfragen.
Ist mir jetzt gleich, ich habe eine Lösung dafür.
Den Code in Zeile fünf aus dem Beitrag #5 abändern.
[CODE lang="java" title="Java"]countDown = LocalTime.ofSecondOfDay(countDownVariable + 1 );[/CODE]
 
Danke. Die Logik dahinter habe ich nun verstanden.

Programmieren ist echt anstrengend. Gefühlsmäßig geht es alle fünf Minuten auf- und abwärts. Kaum hat man für ein Problem die Lösung gefunden, hängt das Programm sich wieder an der nächsten Stelle auf. Vielen Dank für die vielen fleißigen Unterstützer, den es nicht überdrüssig wird den Anfängern immer wieder unter die Arme zu greifen.

Hochachtungsvoll MB
 
Zuletzt bearbeitet:

Zurück
Oben