JSP中系统时间与预设时间字符串匹配失败求助
解决JSP中时间字符串匹配失败的问题
嘿,我来帮你搞定这个时间区间匹配的坑!直接用字符串对比时间真的很容易出问题——字符串是按字典顺序比较的,虽然你的场景是22:00到23:59,看似字符串顺序和时间顺序一致,但这种做法既不健壮,也大概率是你逻辑异常的根源。
问题根源
你现在把系统时间转成字符串后直接和预设时间字符串对比,本质上是在比字符的ASCII码顺序,而不是实际的时间先后。比如后续要是调整区间跨天(比如23:00到次日01:00),字符串对比会直接失效;哪怕是当前区间,一旦时间格式出点小问题(比如变成不带前导零的9:00:00而非09:00:00),匹配逻辑就彻底乱了。
正确的解决方案
推荐两种可靠的实现方式,优先选Java 8+的新时间API,简洁又安全:
方案1:Java 8+ LocalTime(强烈推荐)
LocalTime是专门处理时分秒的类,线程安全且API直观,完全避开日期干扰:
// 获取当前时间的时分秒部分 LocalTime currentTime = LocalTime.now(); // 定义预设的时间区间 LocalTime startTime = LocalTime.of(22, 0, 0); LocalTime endTime = LocalTime.of(23, 59, 59); // 直接比较时间,包含边界值 boolean isInRange = currentTime.compareTo(startTime) >= 0 && currentTime.compareTo(endTime) <= 0; // Java 13及以上可以用更简洁的写法: // boolean isInRange = currentTime.isBetween(startTime, endTime); if (isInRange) { out.println("成功:当前时间处于22:00:00-23:59:59区间内"); } else { out.println("错误:当前时间不在目标区间内"); }
方案2:传统Date+Calendar(兼容旧Java版本)
如果项目还在用Java 8之前的版本,就用Calendar剥离日期部分,只比较时分秒:
// 获取当前时间 Date now = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); // 将预设时间字符串转为Date对象 Date startTime = sdf.parse("22:00:00"); Date endTime = sdf.parse("23:59:59"); // 使用Calendar剥离日期部分,避免日期差异影响比较 Calendar calNow = Calendar.getInstance(); calNow.setTime(now); Calendar calStart = Calendar.getInstance(); calStart.setTime(startTime); // 把当前时间的年月日设置为和预设时间一致 calNow.set(Calendar.YEAR, calStart.get(Calendar.YEAR)); calNow.set(Calendar.MONTH, calStart.get(Calendar.MONTH)); calNow.set(Calendar.DATE, calStart.get(Calendar.DATE)); Date nowOnlyTime = calNow.getTime(); // 比较时间区间(包含边界值) if ((nowOnlyTime.after(startTime) && nowOnlyTime.before(endTime)) || nowOnlyTime.equals(startTime) || nowOnlyTime.equals(endTime)) { out.println("成功:当前时间处于22:00:00-23:59:59区间内"); } else { out.println("错误:当前时间不在目标区间内"); }
为啥原来的字符串对比会错?
举个极端例子:如果系统时间格式意外变成h:mm:ss(不带前导零),比如9:00:00,那字符串"9:00:00"和"22:00:00"对比时,因为'9'的ASCII码比'2'大,会被判定为晚于22:00,这显然完全错误。而用时间对象比较是基于时间的实际数值,根本不会有这类问题。
内容的提问来源于stack exchange,提问作者Probir Ghosh
相关产品推荐
相关产品推荐

