Java中如何比较用户输入的两个日期以实现餐厅预约日期校验
Java餐厅预约日期校验功能实现方案
我们推荐使用Java 8及以上版本内置的java.time包完成日期解析和比较,相比老旧的Calendar/Date类代码更简洁,出错概率更低。修改后完整代码如下:
import java.util.Scanner; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; public class BookRestaurant{ // 存储管理员设置的最晚可预约日期 private static String maxBookDateStr; // 统一日期格式解析器,对应mm/dd/yyyy格式 private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("MM/dd/yyyy"); public static void main(String[] args){ Scanner key = new Scanner(System.in); String uName; String password; String dateByCust; System.out.print("请输入用户名: "); uName = key.nextLine(); System.out.print("请输入密码: "); password = key.nextLine(); // 此处可自行补充密码校验逻辑,演示暂省略 switch (uName){ case "admin": System.out.print("请输入餐厅可预约的最晚日期(格式mm/dd/yyyy): "); maxBookDateStr = key.nextLine(); System.out.println("最晚预约日期设置成功"); break; case "user": if(maxBookDateStr == null) { System.out.println("预约功能暂未开放,请联系管理员设置可预约范围"); break; } LocalDate maxDate = LocalDate.parse(maxBookDateStr, DATE_FORMATTER); // 循环提示用户输入合法日期 while(true) { System.out.print("请输入要预约的日期(格式mm/dd/yyyy): "); dateByCust = key.nextLine(); LocalDate custDate; try { custDate = LocalDate.parse(dateByCust, DATE_FORMATTER); } catch (DateTimeParseException e) { System.out.println("日期格式错误,请按照要求重新输入"); continue; } // 校验日期是否超出范围 if(custDate.isAfter(maxDate)) { System.out.printf("预约日期超出范围,最晚可预约日期为%s,请重新输入%n", maxBookDateStr); } else { System.out.println("预约成功"); break; } } break; default: System.out.println("用户名不存在"); } System.out.print("感谢使用"); key.close(); } }
核心逻辑说明
- 用静态变量
maxBookDateStr存储管理员设置的最晚日期,保证用户登录时可以读取到该配置 - 日期比较使用
LocalDate自带的isAfter方法,直接判断用户输入的日期是否晚于最大可预约日期 - 增加了格式校验逻辑,用户输入格式不对或者日期超出范围时,会循环提示直到输入合法值
如果你一定要使用Calendar类实现,可参考如下日期比较逻辑:
import java.text.SimpleDateFormat; import java.util.Calendar; // 省略其他代码 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); Calendar maxCal = Calendar.getInstance(); maxCal.setTime(sdf.parse(maxBookDateStr)); Calendar custCal = Calendar.getInstance(); custCal.setTime(sdf.parse(dateByCust)); if(custCal.after(maxCal)) { System.out.println("预约日期超出范围,请重新输入"); }
注意SimpleDateFormat是线程不安全的,生产环境不推荐使用。
内容的提问来源于stack exchange,提问作者sealuna
相关产品推荐
相关产品推荐

