首页 > 解决方案 > Java Date .after() 方法未正确比较 12:00

问题描述

经过一番调试,我发现这是因为 12:00 被设置为 0:00,但如果这是 24 小时制,肯定只有 24:00 会设置为 0:00

SimpleDateFormat time_format = new SimpleDateFormat ("hh:mm");

String start_time = "11:00"
String end_time = "12:00"

try {       //parses both times to the date data type
    start_time_format = time_format.parse(start_time);
    end_time_format = time_format.parse(end_time);
} catch (ParseException e) {
    e.printStackTrace();
}


if (end_time_format.after(start_time_format)){
}else{

//how come this is always true

}

标签: javadate

解决方案


这是因为那些旧的DateSimpleDateFormat麻烦

这里发生的是,因为hh被使用,数字12“溢出”到0这里。实际执行此操作的代码可在SimpleDateFormat源代码中的subParse方法中找到。

你应该使用HH. 当您使用它时 – 您应该使用java.time包中的现代 Java 日期和时间 API:

String startTimeStr = "11:00";
String endTimeStr = "12:00";

LocalTime startTime = LocalTime.parse(startTimeStr);
LocalTime endTime = LocalTime.parse(endTimeStr);
// No need for a explicit formatting string, because the default is used here,
// which is HH:mm[:ss[.nnnnnnnnn]]

if (endTime.isAfter(startTime)) {
    System.out.println("If");
}
else {
    System.out.println("Else");
}

但是,即使您DateTimeFormatter在模式 stringhh:mm中使用了显式,也会抛出 a DateTimeException,因为要解析的值是不明确的。十二小时制中的 11:00 和 12:00 可能意味着两件事:上午或下午。默认情况下,解析器不喜欢模棱两可的值,因此作者决定立即停止解析过程并抛出异常,而不是仅仅选择一个并继续前进,这给大家造成了困惑。以下代码显示了这一点:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm");
String startTimeStr = "11:00";
LocalTime startTime = LocalTime.parse(startTimeStr, formatter);

推荐阅读