Timer Format: 00:00:00

Renni

Mitglied
Hallo,
Ich wollte fragen, wie ich einen Timer mit dem oben genannten Format machen könnte, also hh:mm:ss. Ich weiß nicht, wie ich das machen soll... So: if (sekunden == 60)
oder alle einzeln laufen lassen... Ich würde mich sehr freuen, wenn mir da jemand helfen könnte.

Mfg
Christian
 
Gibt ein paar Möglichkeiten. Eine z.B. so:
Java:
private static String toFormattedTime(long seconds) {
  return String.format("%02d:%02d:%02d",
      (seconds / 60 / 60) % 24,
      (seconds / 60) % 60,
       seconds % 60);
}
public static void main(String[] args) throws InterruptedException {
  long seconds = 0L;
  while (true) {
    System.out.println(toFormattedTime(seconds++));
    Thread.sleep(1000L);
  }
}
 
stimmt, das sieht schön aus, das werde ich so übernehmen und verstehen, denn es gilt ja, dass man verstehen und nicht übernehmen soll 😉
Danke!

Mfg
Christian
 
Gibt ein paar Möglichkeiten. Eine z.B. so:
Java:
private static String toFormattedTime(long seconds) {
  return String.format("%02d:%02d:%02d",
      (seconds / 60 / 60) % 24,
      (seconds / 60) % 60,
       seconds % 60);
}
public static void main(String[] args) throws InterruptedException {
  long seconds = 0L;
  while (true) {
    System.out.println(toFormattedTime(seconds++));
    Thread.sleep(1000L);
  }
}

dieser Timer ist aber nicht genau 😉
 
Mit DateFormat geht das recht einfach:
Java:
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimeFormat1 {
    private static String getFormattedTime() {
        DateFormat df = new SimpleDateFormat("HH:mm:ss.SS");
        return df.format(new Date());
    }

    public static void main(String[] args) throws InterruptedException {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(getFormattedTime());
            }
        }, 0, 500);
        Thread.sleep(30_000);
        timer.cancel();
    }
}
 
holst du alle 500ms ein formatted date
Das ist ja nur ein Beispiel... :
Java:
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimeFormat1 {
    private static final DateFormat MY_TIME_FORMATTER = new SimpleDateFormat("HH:mm:ss.SS");

    private static String getFormattedTime() {
        return MY_TIME_FORMATTER.format(new Date());
    }

    public static void main(String[] args) throws InterruptedException {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(getFormattedTime());
            }
        }, 0, 1_000);
        Thread.sleep(30_000);
        timer.cancel();
    }
}
 
Wieder mal so typisch. Für einen Timer der jede Sekunde anzeigen soll holst du alle 500ms ein formatted date.
Damit wolltest du natürlich darauf aufmerksam machen, dass @BlackBookOne die Anforderungen nicht richtig verstanden hat, und anstatt eines Timers immer die aktuelle Zeit anzeigt 😉


Als erfahrener Entwickler ist dir ja schließlich bewusst, dass die Variante mit Date (passend zur Fragestellung umgesetzt) schneller wäre, als die Variante mit String.format, und das ganze mit der neuen Time-API noch mal schneller laufen würde 😉
 
Also der oben genannte, ist mir genau genug. Hier geht es mir jetzt nicht um Millisekunden, wenn da eine Sekunde verzögerung ist, ist das schon ok, aber danke!
 
nein, ich wollte ich nicht. Aber wenn du nicht verstehst was ich meine, dann bestätigt das eigentlich nur meine Meinung. Danke
Könntest deine Meinung auch einfach darlegen, sonst bleibt das wieder mal substanzloses meckern...

Offensichtlich siehst du ja irgendeinen Nachteil darin, ein Datum zu formatieren, anstatt mit Sekunden zu rechnen und String.format zu nehmen, sonst hättest du ja nicht die Lösung mit Date angemeckert, sondern die andere.

Der Gedanke, dass du dich dabei mal wieder fälschlicherweise an der "Performance" störst liegt einfach nahe, vor allem da du ja keinen anderen Grund nennen kannst – du meintest doch nicht wirklich nur die 500s als Intervall?

Vielleicht hast du ja valide Gründe, aber wenn du die nicht äußern kannst, ist das halt nicht mehr als dummes rumpöbeln 🤷‍♂️
 
Doch ich meine genau die 500ms. ich brauche kein Hintergrundwissen um zu sehen, dass diese Routine doppelt so viel Rechnerei benötigt wie eigentlich nötig. warum muss das also sein? Wenn jemand aus unwissenheit inperformant programmiert ist das eine Sache, wenn er es aber aus schlamperei heraus tut ärgert es mich.
 
Doch ich meine genau die 500ms. ich brauche kein Hintergrundwissen um zu sehen, dass diese Routine doppelt so viel Rechnerei benötigt wie eigentlich nötig. warum muss das also sein? Wenn jemand aus unwissenheit inperformant programmiert ist das eine Sache, wenn er es aber aus schlamperei heraus tut ärgert es mich.
Dass das ein Beispiel ist, was eben nicht einen Timer in Sekunden-Abständen mit "HH:mm:ss", sondern die aktuelle Zeit in 500ms-Abständen mit "HH:mm:ss.SS" ausgibt, ist dir schon bewusst?
Der Code macht etwas völlig anderes, als das vom TO geforderte, eben weil es ein Beispiel ist, welches der TO dann nicht einfach ohne nachdenken übernehmen kann...
 
Dass das ein Beispiel ist, was eben die Zeit nicht in Sekunden-Abständen mit "HH:mm:ss", sondern in 500ms-Abständen mit "HH:mm:ss.SS" ausgibt, ist dir schon bewusst?
Der Code macht etwas völlig anderes, als das vom TO geforderte, eben weil es ein Beispiel ist, welches der TO dann nicht einfach ohne nachdenken übernehmen kann...
Ja und? Hat nix damit zu tun das wenn die Aufgabenstellung richtig gewesen wäre er immer noch 2x pro Sekunde eine Routine aufruft die nur einmal die Sekunde eine Änderung macht
 
Ja und? Hat nix damit zu tun das wenn die Aufgabenstellung richtig gewesen wäre er immer noch 2x pro Sekunde eine Routine aufruft die nur einmal die Sekunde eine Änderung macht
Du meinst, wenn quasi alles an dem Code anders gemacht worden wäre, ständen trotzdem noch die 500ms dadrin?

Gut, das mag dir vielleicht so passieren, den meisten anderen traue ich aber auch zu, neben den anderen Stellen auch diese Stelle anzupassen 😉
 
Langsam werden deine persönlichen Angriffe etwas langweilig. Als Moderator sollte man sich besser im Griff haben. Sagt ja schon das Wort Moderator und nicht Agressor
 
@Thallius meint doch nur, dass es wenig optimal ist, wenn zwei mal in der Sekunde eine Instanz von SimpleDateFormat erzeugt wird.
Den Punkt kann ich durchaus nachvollziehen, wobei ich den auch nicht als zu kritisch ansehe. Aber ja: So Formate erstelle ich auch einmal und behalte sie dann für das nächste Mal einfach bei so die Formatierung nicht auf einer veränderlichen Quelle kommt.

Aber mir ist auch mehr die nicht erfüllten Anforderungen aufgefallen, und das "typisch" hätte fast eine Antwort getriggert, aber das habe ich dann nur Thallius im Gespräch aufgedrängt um eben eine unnötige Diskussion zu vermeiden... Und im Augenblick kann ich das hier auch nicht wirklich nachvollziehen, denn jeder von euch beiden hat einen validen Punkt die sich nicht widersprechen ...
 
@Thallius meint doch nur, dass es wenig optimal ist, wenn zwei mal in der Sekunde eine Instanz von SimpleDateFormat erzeugt wird.
Das SimpleDateFormat wird nur ein einziges Mal erzeugt?

Nur das Date wird mehrmals erzeugt, aber da kommt man nicht wirklich drum rum, wenn man zweimal pro Sekunde die aktuelle Uhrzeit ausgeben will...
 
Zuletzt bearbeitet:
Es ist ein bisschen umständlich, weil die neue DateTime-API Scheiße ist, aber auch eine Zeitspanne zu formatieren ist möglich:
Java:
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimeFormat1 {
    private static final DateFormat MY_TIME_FORMATTER = new SimpleDateFormat("HH:mm:ss.SS");

    private static Date start_date = null;

    private static void restart() {
        start_date = new Date();
    }

    private static String getFormattedDuration() {
        LocalDateTime midnight_time = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT);
        LocalDateTime now_time = LocalDateTime.now();
        Date midnight_date = Date.from(midnight_time.atZone(ZoneId.systemDefault()).toInstant());
        Date now_date = Date.from(now_time.atZone(ZoneId.systemDefault()).toInstant());
        return MY_TIME_FORMATTER.format(new Date(now_date.getTime() - start_date.getTime() + midnight_date.getTime()));
    }

    public static void main(String[] args) throws InterruptedException {
        restart();
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(getFormattedDuration());
            }
        }, 0, 1_000);
        Thread.sleep(30_000);
        timer.cancel();
    }
}

Soll die Stoppuhr eigentlich länger als 24h laufen?
 
Java:
    private static String getFormattedDuration(Duration duration) {
        return DateTimeFormatter.ISO_TIME.format(LocalTime.MIDNIGHT.plus(duration));
    }
 
du meinst das ernst und findest Date besser als die neue API
Ich bin mit meiner Meinung ja nicht alleine. Unter praktisch jeder Stackoverflow Frage steht, dass die DateTime API Scheiße ist und man besser z. B. Joda-Time verwenden sollte. Und man sieht das ja auch am umständlichen Code, der nötig ist, um eine Zeitspanne formatiert auszugeben. Also von daher ist deine Meinung absolut nicht nachvollziehbar.
 
Hmm ... das erinnert mich an tolle Aussagen a.la. Wir haben ja keine Ahunung im Vergleich zu den Leuten auf SO ...

Aber echt schlimm unser Verständnis von Clean Code ... das hatten wir doch in genug Threads von unserem Herren zu hören bekommen ...
 
Damit Du nicht groß recherchieren musst bezüglich Deiner Position, dass Joda-Time doch so viel besser ist, einfach mal ein Zitat von https://www.joda.org/joda-time/ - der besseren Alternative zu der neuen Date/Time API von Java:
The standard date and time classes prior to Java SE 8 are poor. By tackling this problem head-on, Joda-Time became the de facto standard date and time library for Java prior to Java SE 8. Note that from Java SE 8 onwards, users are asked to migrate to java.time (JSR-310) - a core part of the JDK which replaces this project.
Aber keine Angst: Du musst Deine Zeit nicht verschwenden. Du musst also über Deine Aussagen nicht reflektieren noch Fakten prüfen oder Dich mit irgendwelchen Dingen auseinander setzen. Das verlangt hier niemand von Dir!

Und wir haben doch immer gerne etwas zu lachen ...
 
Wenn Du jetzt noch irgendwelche Argumente bringen würdest ...

Wobei es einfach nur wieder ein triviales Textverständnis-Problem auf Deiner Seite sein dürfte:
Unter praktisch jeder Stackoverflow Frage steht, dass die DateTime API Scheiße ist und man besser z. B. Joda-Time verwenden sollte.
Ja - die ALTE date/time API war schrott ... daher gibt es ja die NEUE, die dann hier gezeigt wurde und um die es dann ging:
Moment, du meinst das ernst und findest Date besser als die neue API, die es nur gibt, weil eigentlich alles an Date scheiße ist? 😵

Und zu der Neuen API sagen selbst die Leute hinter Joda-Time, dass man bitte die neue API nutzen soll (Siehe Zitat von der Homepage) ...

Also daher ein einfacher Fall von schlechtem Textverständnis auf Deiner Seite - wie so oft. Und es tut schon fast in der Seele weh, dies jetzt aufzudecken anstatt einfach noch etwas zu sticheln und Dich noch etwas so neben der Spur zu lassen ... In die Phase "pers. Angriffe ohne jegliche fachliche Aussage" haben wir Dich ja schon bekommen ...

Aber einfach mal aus reinem Interesse: Du hattest doch schon wieder einen neuen Account erstellt hatte ich gesehen. Wechselst Du dennoch regelmäßig auch noch zu den etwas jüngeren Älteren Accounts? Was für Beweggründe treiben Dich da an? Einen Account im Forum hier zu erstellen ist ein tolles Erfolgserlebnis? Oder die ersten Erfolge im Forum a.la. jemand hat Like gedrückt? Oder was treibt Dich an? Der Punkt a.la. "jemand verlangsamt das Forum für deinen Account" wird es doch nicht sein, oder?
 

Neue Themen


Zurück
Oben