java - 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
}
解决方案
这是因为那些旧的Date
,SimpleDateFormat
很麻烦。
这里发生的是,因为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);
推荐阅读
- python - 这应该抛出一个 KeyError 吗?
- python - 如何在Python中过滤出具有特定字符串的多个列
- .net - Docker:无法在 asp.net core 2.1 上运行 dotnet restore
- java - SQLite Db 未更新
- haskell - 在元组列表中找不到搜索值时出现“错误字符”
- react-native - 我可以在 React Native 的 ComponentDidMount 中使用带有异步等待的函数吗?
- widget - Appmaker:将一个页面片段的多个副本作为一个处理?
- java - 如何使用 API 调用设置过去 Wordpress 帖子的日期?
- r - 使用 R,dplyr 矩阵的总和列表列(来自嵌套的 data.frame)
- amazon-s3 - 如何从 AWS S3 检查 Redshift COPY 命令性能?