package com.jiudian.manage.until; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; /** * 时间操作工具类 * 提供时间格式转换、日期差值计算的通用方法,支撑系统中时间相关业务(如订单入住天数计算、时间格式统一) */ public class TimeUtil { /** * 计算两个日期之间的天数差(结果为 date2 - date1 的天数,支持跨年份计算) * 用于订单金额计算(入住天数 × 房间单价 = 订单总金额) * @param date1 起始日期字符串(格式:yyyy-MM-dd,如"2024-05-01") * @param date2 结束日期字符串(格式:yyyy-MM-dd,如"2024-05-05") * @return 两个日期的天数差(如上述示例返回4,表示入住4天) */ public static int getBetweenDay(String date1, String date2) { // 1. 创建GregorianCalendar实例(日历对象),用于处理日期计算 Calendar d1 = new GregorianCalendar(); Calendar d2 = new GregorianCalendar(); // 2. 将传入的日期字符串转为Date类型,再设置到日历对象中 d1.setTime(formatterTime(date1)); d2.setTime(formatterTime(date2)); // 3. 先计算同一年份内的天数差(结束日期的年天数 - 起始日期的年天数) int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR); // 4. 获取结束日期的年份,判断是否跨年份(起始年份 != 结束年份) int endYear = d2.get(Calendar.YEAR); if (d1.get(Calendar.YEAR) != endYear) { // 5. 跨年份时,累加起始年份到结束年份之间每一年的总天数 do { // 累加当前起始年份的总天数(如2023年有365天) days += d1.getActualMaximum(Calendar.DAY_OF_YEAR); // 起始年份加1,继续计算下一年,直到起始年份等于结束年份 d1.add(Calendar.YEAR, 1); } while (d1.get(Calendar.YEAR) != endYear); } // 6. 返回最终的天数差 return days; } /** * 将字符串格式的日期转为Date类型(固定格式:yyyy-MM-dd) * 解决前端传递的日期字符串与后端Date类型不兼容的问题,统一日期格式 * @param date 日期字符串(格式必须为yyyy-MM-dd,否则会抛出ParseException并打印异常栈) * @return 转换后的Date对象,转换失败时返回null */ public static Date formatterTime(String date) { // 1. 创建SimpleDateFormat实例,指定目标日期格式(yyyy-MM-dd) SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); Date newDate = null; // 2. 尝试解析日期字符串,捕获ParseException(格式不匹配时抛出) try { newDate = formatter.parse(date); } catch (ParseException e) { // 3. 解析失败时打印异常栈,便于排查问题(如前端传递错误格式的日期) e.printStackTrace(); } // 4. 返回转换后的Date对象(失败时为null) return newDate; } }