Возьмите пользовательские часы, минуты, секунды и начните обратный отсчет в формате чч: мм: сс

Я столкнулся с проблемой при запуске таймера и как поместить данные в дату. Это мой код

Calendar cl = Calendar.getInstance();
cl.set(Calendar.HOUR, 0);
cl.set(Calendar.MINUTE, 0);
cl.set(Calendar.SECOND, 0);
cl.add(Calendar.HOUR, hr);
cl.add(Calendar.MINUTE, min);
cl.add(Calendar.SECOND, sec);
Date date = cl.getTime();
Timer t =new Timer(1000, new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent ae) {
     SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
     jLabel2.setText(timeFormat.format(date));
  }
});
t.start();

Это правильно использовать Calendar поместить данные в дату и запустить таймер?

1 ответ

Я не думаю, что вы должны использовать Calendar за это. Calendar предназначен для представления точки в календарном времени, а не продолжительности в часах, минутах и ​​секундах. Также, Calendar это старый материал и заменен новыми и более дружественными к программисту классами в Java 8 (см. java.time пакет).

Из комментариев я понимаю, что вам нужен таймер обратного отсчета. Я предлагаю:

    Timer t = new Timer(1000, new ActionListener() {
        Duration time = Duration.ofHours(hr).plusMinutes(min).plusSeconds(sec);
        @Override
        public void actionPerformed(ActionEvent ae) {
            time = time.minusSeconds(1);
            jLabel2.setText(formatDuration(time));
        }
    });
    t.start();

Я использую Duration class, один из классов, представленных в Java 8. Он рассчитан на продолжительность в часах, минутах и ​​секундах, так что это то, что нам нужно для работы. Тем не менее, он не подходит для форматирования. Вы можете использовать его toString метод, он даст вам строку, как PT9M52S в течение 9 минут 52 секунды, вероятно, не то, что большинство пользователей находят наиболее интуитивным. Вместо этого я использую этот вспомогательный метод для форматирования:

static String formatDuration(Duration dur) {
    long hr = dur.toHours();
    Duration remainder = dur.minusHours(hr);
    long min = remainder.toMinutes();
    long sec = remainder.minusMinutes(min).getSeconds();
    return String.format("%02d:%02d:%02d", hr, min, sec);
}
Другие вопросы по тегам