从用户输入小时数秒,并以hh:mm:ss格式开始倒计时

时间:2017-04-01 06:43:01

标签: java swing time javax.swing.timer

我在启动计时器以及如何将数据放入日期方面遇到问题。

这是我的代码:

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 个答案:

答案 0 :(得分:3)

我认为你不应该使用CalendarCalendar用于表示日历时间中的点,而不是以小时,分钟和秒为单位的持续时间。此外,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类,这是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);
}