You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
3.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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