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

标签 java date calendar

我正在制作一个小型闹钟应用程序以复习 Java。该应用程序的目的是让用户设置时钟时间和闹钟时间,然后当系统时间等于闹钟时间时闹钟应该“响起”。

时钟类包含日历和日期对象。

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

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

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. 如何使 Date 或 Calendar 对象中的时间保持滴答作响,即使它已被修改?

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

最佳答案

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

基本上,您需要建立某种可以在后台更新/修改时钟的“滴答”线程...

您可以编写自己的 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...
        }
    }
}

小心

Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers. The thread does not lose ownership of any monitors.

另一种方法是使用 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...
    }
}

再一次,当心...

Subsequent executions take place at approximately regular intervals

关于java - 如何不断更新日期/日历对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12701305/

相关文章:

java - 从 Java 8 流中获取下一个项目

将项目 .net 目标框架从 3.5 升级到 4.5 后日历中的 C# 错误

mysql - 检索MySQL中的数据并在日历控件VB.Net中显示

mysql - 从SQL中的时间戳,选择今天、昨天、本周、本月以及两个日期之间的记录 php mysql

swift - 我怎样才能始终如一地获取 swift4 中两个日期之间所有天数的计数或列表?

date - SQLITE 按日期排序不起作用

java - 将年份和日期(例如 2013216 = 2013 年的第 216 天)转换为 Java 中的完整日期

java - IllegalArgumentException 返回对象声明中给定的值

java - 发现多个文件具有独立于操作系统的路径 'OSGI-OPT/src/org/kohsuke/args4j/spi/URLOptionHandler.java'

java - 如何使用 Jackson 进行部分反序列化