日常工作中我们可能会遇到这种情况
校验某个业务场景下的预约时间是否在我们预设的合理日期和时间范围,那么以下代码就能帮你解决这个问题:
private void checkTimePeriod(Date reservationTime, ServiceTimePeriod timePeriod) {
//校验日期与时间
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
Date timeNow = reservationTime;
Calendar calendarNow = Calendar.getInstance();
calendarNow.setTime(new Date());
calendarNow.add(Calendar.DAY_OF_YEAR, 0);// 开始时间今天
Date dateNow = DateUtil.parseDate(DateUtil.format(timeNow, "yyyy-MM-dd"));
Date startDate = DateUtils.parseDate(dateFormat.format(calendarNow.getTime()));
Calendar calendarEnd = Calendar.getInstance();
calendarEnd.add(Calendar.DAY_OF_YEAR, timePeriod.getDays());
Date endDate = DateUtils.parseDate(dateFormat.format(calendarEnd.getTime()));
if (dateNow.before(startDate) || dateNow.after(endDate)) {
logger.info("date:{},{},{}", dateNow, startDate, endDate);
Assertion.isFalse(true, "Error", "当前日期不在服务范围内");
}
try {
Date nowTime = timeFormat.parse(timeFormat.format(timeNow));
Date startTime = timeFormat.parse(timePeriod.getStartTime() + ":00");
Date endTime = timeFormat.parse(timePeriod.getEndTime() + ":00");
if (nowTime.before(startTime) || nowTime.after(endTime)) {
logger.info("time:{},{},{},id:{}", nowTime, startTime, endTime);
Assertion.isFalse(true, "Error", "当前时间不在服务范围内");
}
} catch (ParseException e) {
logger.info("日期转换异常:{}", e);
Assertion.isFalse(true, "Error", "系统服务异常,请联系管理员");
}
}
其实代码的核心是如何将日期和时间拆分,日期的对比可以直接进行,或者将日期指定到00:00这样的边界值域上。时间的比较需要将日期调整到同一个日期上,然后对datetime进行比较