选择时比较时间不正确 12:00

Comparing time is incorrect when picking 12:00

我正在创建一个预订系统,我不想让用户预订开始时间 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");
        }

除了我选择 start/end 时间为 12:00 之外,这非常有效。程序输出与它应该输出的相反,我不确定为什么。

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

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

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

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

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

你应该使用 HH:mm.

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

更新

勾选SimpleDateFormatdoc:

H: Hour in day (0-23)

h: Hour in am/pm (1-12)

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");
    }

将我的代码更改为此解决了这个问题..

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对象填入其中​​。那么当用户 select 时,你不需要解析每个。您的 JComboBox 将调用 LocalTime.toString(),这将 return 一个类似于 09:00 的字符串,组合框将依次显示并让用户 select.

    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.time 中的 LocalTime,现代 Java 日期和时间 API。 java.time 通常比 SimpleDateFormatDate 等旧的和过时的日期和时间 类 更好用。

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