【问题标题】:Comparing time is incorrect when picking 12:0012:00采摘时比较时间不正确
【发布时间】:2018-04-26 12:21:46
【问题描述】:

我正在创建一个预订系统,我不想让用户预订开始时间 11:00 和结束时间 09:00(过去)(我使用 24 小时制)。 我有两个组合框,其中填充了充当开始和结束时间的字符串 (09:00,10:00,11:00,12:00,13:00....)

我有这个代码:

 String start = (String) startTime.getSelectedItem();
        String end = (String) endTime.getSelectedItem();
        try {
            if(new SimpleDateFormat("hh:mm").parse(start).before(new SimpleDateFormat("hh:mm").parse(end))){
                System.out.println("test1");// future date - good

            }else{
                System.out.println("fail2");// old date - bad
            }
        } catch (ParseException ex) {
                System.out.println("error");
        }

这非常有效,除非我选择开始/结束时间为 12:00。程序输出与它应该输出的相反,我不确定为什么。

如果我选择开始时间 14:00 和结束时间 12:00,程序将输出 fail2(good output),

如果我选择开始时间 09:00 和结束时间 12:00,程序将输出 fail2(应该是 test1),

如果我选择开始时间 12:00 和结束时间 10:00,程序将输出 test1(应该是 fail2),

如果我选择开始时间 12:00 和结束时间 15:00,程序将输出 test1(输出良好)

这种问题只有在我选择12:00时才会出现..

【问题讨论】:

  • 我认为您的格式需要为HH:mm,因为hh 指的是12 小时制docs.oracle.com/javase/tutorial/i18n/format/…
  • 考虑在您的时代使用LocalTime time = LocalTime.parse(start);
  • 我建议你避免使用SimpleDateFormat 类。它不仅过时了,而且出了名的麻烦。今天我们在java.time, the modern Java date and time API 中做得更好。加分项:正如@notyou 所说,您不需要显式格式化程序。即使您确实使用了DateTimeFormatter,它也会通过异常通知您您使用了不正确的格式模式。
  • 谢谢你们的提示,我必须检查一下这个 LocalTime。
  • @OleV.V.赞成,但我的意思是你显然链接的旧问题.... TT_TT

标签: java datetime simpledateformat


【解决方案1】:

你应该使用HH:mm

hh 范围 01-12,而 HH 范围 1-23

更新

检查SimpleDateFormatdoc

H:一天中的小时 (0-23)

h:上午/下午 (1-12) 小时

【讨论】:

  • 这个答案也解决了这个问题。谢谢@user6690200
  • @hDDen 我必须提醒你,在你的回答中,你使用的是HH...而在你的问题中,它是hh
  • 我以前不知道这会有所作为,现在我知道了。再次感谢您。
  • @hDDen 没问题 :)
  • 这个答案指出了您的实施失败的原因,出于实际目的并不是最好的解决方案,因为它不允许跨越午夜的间隔。这是对您问题的一个很好的答案,但不是最佳解决方案。
【解决方案2】:
public static void checkTimes(String start, String end) {
    try {
        if (LocalTime.parse(start).isBefore(LocalTime.parse(end))) {
            System.out.println("test1");// future date - good
        } else {
            System.out.println("fail2");// old date - bad
        }
    } catch (DateTimeParseException dtpe) {
        System.out.println("error");
    }
}

让我们试试吧:

    checkTimes("14:00", "12:00");
    checkTimes("09:00", "12:00");
    checkTimes("12:00", "10:00");
    checkTimes("12:00", "15:00");

打印出来:

fail2
test1
fail2
test1

我相信这与您的意图一致。请注意,LocalTime 无需显式格式化程序即可解析您的字符串。此外,如果您相信您的组合框只包含有效的时间字符串,您可以省略 try-catch 构造,因为 DateTimeParseException 是一个未经检查的异常。

如果startTimeendTimeJComboBox,我相信你甚至可以将LocalTime对象填入其中​​。那么当用户从每一个中选择一个时,你就不需要解析了。您的JComboBox 将调用LocalTime.toString(),它会返回一个类似09:00 的字符串,然后会显示组合框并让用户选择。

    LocalTime[] times = { LocalTime.of(9, 0), LocalTime.of(10, 0), LocalTime.of(11, 0), 
                          LocalTime.of(12, 0), LocalTime.of(13, 0), LocalTime.of(14, 0) };
    JComboBox<LocalTime> combo = new JComboBox<>(times);

展开:

我正在使用来自java.timeLocalTime,这是现代Java 日期和时间API。与 SimpleDateFormatDate 等旧的和过时的日期和时间类相比,java.time 通常更易于使用。

链接:Oracle tutorial: Date Time解释如何使用java.time

【讨论】:

  • 这是一个比不支持跨越午夜的预订间隔的解决方案要好得多的解决方案。不允许跨越午夜使得支持来自任何时区的用户变得更加复杂。问题是您真正想要什么:比较 numbers 还是比较 times?这是实际比较 times 而不是碰巧代表时间部分的相对任意数字的解决方案。 (这种任意性是您最初的解决方案不起作用的部分原因。)
  • 非常感谢您对答案的精彩解释。
【解决方案3】:
String start = (String) startTime.getSelectedItem();
        String end = (String) endTime.getSelectedItem();
        SimpleDateFormat timer = new SimpleDateFormat("HH:mm");

        try {
            Date startD = timer.parse(start);
            Date endD = timer.parse(end);
            if(startD.before(endD)){
                System.out.println("test1");// future date - good
            }else{
                System.out.println("fail2");// old date - bad
            }
        } catch (ParseException ex) {
                System.out.println("error");
    }

将我的代码更改为此修复了此问题..

【讨论】:

  • 不,@user6690200 的答案是正确的解释。
  • @andy 是否有可能有两个答案提供正确答案?顺便说一句,他们俩都使用过时且臭名昭著的麻烦 SimpleDateFormat 类。无论如何,谢谢你,hDDen,为我们所有人提供你的解决方案。
  • @OleV.V.这个答案实际上是使用HH,就像我发布的那样。所以它们基本上是一样的。
  • @hDDen 您首先写道,使用两个 SimpleDateFormat 实例解决了这个问题。我想你已经删除了这句话。这就是我所指的。解决方案是“HH:mm”。所以你的答案现在是正确的。 (忽略 SimpleDateFormat 过时的事实)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多