|
|
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;
|
|
|
}
|
|
|
} |