如何不断更新日期/日历对象?

时间:2012-10-03 02:57:58

标签: java date calendar

我正在制作一个小闹钟应用程序来刷新Java。该应用程序的目的是让用户设置时钟时间和闹钟时间,然后当系统时间等于闹钟时间时,闹钟应该“熄灭”。

clock类包含Calendar和Date对象。

时钟是从类外的主方法引用的。在那个主要方法中,我构建了一个简单的命令行用户界面,用户可以在其中设置时钟和闹钟的时间。默认情况下,时钟初始化为当前系统时间。

但是,这里是自动初始化和用户定义的时钟对象的问题 - 它们不是“滴答”或更新。

Clock regularClock = new Clock(); //Defaults clock (using a Date) to the system time

while (userInput != "Quit")
{
   switch(userInput)
   {
      ...Other choices here...
      case "Set Time":  System.out.print("Enter hour: ");
                    hours = kb.nextInt();
                System.out.print("\nEnter minutes: ");
                minutes = kb.nextInt();
                ACR.regularClock.setTime(hours, minutes);
                System.out.println("Clock has been set");

       case "Set Alarm": System.out.print("Enter hour: ");
            hours = kb.nextInt();
            System.out.print("\nEnter minutes: ");
            minutes = kb.nextInt();
            ACR.alarmClock.setTime(hours, minutes);
            ACR.alarmClock.setAlarmOn(true);
            System.out.println("Alarm has been set.");
            break;
      ...Other choices here...

  userInput = keyboard.next();
   }

正如您将看到的,没有循环或任何东西可以刷新或保持regularClock滴答作响。出于某种原因,当我开始时,我认为Date和Calendar对象只是在创建后保持运行 - 有点像秒表。

所以现在我想知道在这个while循环中更新它们的最佳方法是什么。如果只允许使用默认的系统时钟,那将很容易 - 我每次都可以在while循环的开头创建一个新的Date对象。但是,如果他们选择了这个时间,那将覆盖用户创建的时钟时间。

此外,如果用户不输入任何输入 - 而只是让应用程序坐在那里 - 他/她将输入输入 - 不应该仍然刷新时间并检查regularClock = alarmClock时间?我怎么能这样做?

我意识到我现在正在散步,所以我会留下它。我一直在努力,但无法找到最佳解决方案。如果您有任何疑问,请告诉我们!

简短摘要问题:

  1. 如何在日期或日历对象中保留时间,即使已经修改过了?

  2. 如何在等待用户输入的同时不断更新这些对象?

2 个答案:

答案 0 :(得分:3)

有更简单的方法,但这不是问题;)

基本上,你需要建立一种可以在后台更新/修改时钟的“tick”线程......

您可以编写自己的Thread / Runnable来执行这些任务,但这些任务本质上是不准确的......

像...一样的东西。

Thread thread = new Thread(new Ticker());
thread.setDaemon(true); // Otherwise the JVM won't stop when you want it t
thread.start();

//...

public class Ticker implements Runnable {
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException exp) {
            }
            // Update static reference to the clock...
        }
    }
}

要注意

  

导致当前正在执行的线程进入休眠状态(暂时停止   执行)指定的毫秒数,受制于   系统定时器和调度程序的精度和准确性。线程   不会失去任何监视器的所有权。

另一种方法是使用java.util.Timer

Timer timer = new Timer(true);
timer.scheduleAtFixedRate(new Ticker(), 1000, 1000);

//...

public class Ticker extends TimerTask {
    public void run() {
        // Update static reference to the clock...
    }
}

再次提防......

  

后续执行大致定期进行

答案 1 :(得分:2)

日期和日历对象不“运行” - 它们代表特定的时间点。 我相信你所寻找的是Timer类。