【问题标题】:Compare user defined time and current time Java比较用户定义时间和当前时间 Java
【发布时间】:2015-09-29 09:08:59
【问题描述】:

我正在尝试将 HH:MM 格式的用户定义时间与无限循环中的当前时间进行比较。当它们相等时,应该发生一些动作。

我使用了以下代码:

//taking user input
DateFormat sdf = new SimpleDateFormat("hh:mm");
String time = jFormattedTextField1.getText();
userTime = sdf.parse(time);

//taking current time
Date timeNow = new Date();
while (true){
    if (timeNow.equals(userTime)){
    System.out.println("The time equals, task is done!");
    ChangingWindow window = new ChangingWindow(chosenColor);

当我打印这两个时间点时,我收到以下信息:

用户时间:Thu Jan 01 10:35:00 CET 1970

当前时间:2015 年 9 月 29 日星期二 10:33:21 CEST

当前时间显然没问题,但对于用户定义的时间,他不断返回纪元。如果有人有任何建议,我将不胜感激!

【问题讨论】:

  • 如果你想发布你的固定代码,那就把它作为一个答案。编辑问题不是正确的方法。
  • 我将问题的新部分移到了单独的答案中,因为正如我所说的 an answer doesn't belong to the question。我将此答案设为“社区 wiki”,因此,如果您愿意,请随时对其进行改进。顺便说一句,“接受的答案”复选标记应保留在 Tobias 的答案上,因为这是帮助您解决问题的答案。
  • 谢谢汤姆,下次我会记住的。

标签: java date time compare


【解决方案1】:

如果你只想比较时间HH:MM,我建议使用LocalTime

"LocalTime 是一个不可变的日期时间对象,表示时间, 通常被视为时-分-秒。”

“这个类不存储或表示日期或时区。相反, 它是对挂钟上显示的当地时间的描述。”

LocalTime user = LocalTime.parse("12:55");
LocalTime now = LocalTime.now().truncatedTo(ChronoUnit.MINUTES);

if (user.equals(now)) { ... }

编辑:回应您的评论

userTimetimeNow 不会更新,因此在每次迭代中您总是比较相同的值。结果不会改变。您需要在while 中更新timeNow

无论如何,我不能认为while (true) 是个好主意。我不知道您需要实现什么,但是如果您想等到达到用户时间,那么我将确定在那之前剩余的时间并让进程休眠这段时间。比如:

long time = Duration.between(now, user).toMillils();
Thread.sleep(time);

【讨论】:

  • 感谢 Tobias,我仍然没有得到好的结果,但现在看起来应该如此。您认为:while (true){if (timeNow.equals(userTime)){..do something...} 比较这 2 次是个好主意?我的意思是,也许我没有得到最终匹配,因为 timeNow 并不总是将自身更新到当前时间,而只是更新到创建对象时的一个时间点?如果我没有说清楚,请告诉我。再次感谢!
  • 我已经回复编辑帖子了,评论太长了
  • 正确答案。您可以考虑使用 ScheduledExecutorService 和它自己的线程池而不是 Timer 来释放当前线程。
【解决方案2】:

如果您未设置 YEAR、MONTH、DAY,则从 1970 年 1 月 1 日开始。

所以基本上你需要将 YEAR、MONTH、DAY 设置为你喜欢的日期。

在您的代码中,您正在创建一个新的 Date 设置,仅设置小时和分钟,并将其他值保留为默认值。

来自javadoc

此解析操作使用日历来生成日期。解析之前清除日历的所有日期时间字段,并且日历的日期时间字段的默认值用于任何缺少的日期时间信息。 例如,如果解析操作没有给出年份值,则使用 GregorianCalendar 解析的 Date 的年份值为 1970

【讨论】:

    【解决方案3】:

    这是遵循 Tobías 说明的 OPs(*) 固定代码:

    //get user time and current time
    String time = jFormattedTextField1.getText();
    LocalTime userTime1 = LocalTime.parse(time);
    LocalTime timeNow = LocalTime.now().truncatedTo(ChronoUnit.SECONDS);
    
    //calculate the diff in seconds
    int timeDur = (int)Duration.between(timeNow, userTime1).getSeconds();
    //start the timer object using this difference
    Countdown countdown = new Countdown (timeDur);
    

    (*) 从编辑的问题中提取,因为它不属于那里 (see this meta discussion)

    【讨论】:

      猜你喜欢
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      相关资源
      最近更新 更多