zxl
2025-12-22 cc4a3ff932b1e768914a4aff0eeaa866d08f9b91
common/src/main/java/com/ycl/common/utils/DateUtils.java
@@ -5,10 +5,8 @@
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.util.Date;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.time.format.DateTimeFormatter;
import java.util.*;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.lang.Nullable;
@@ -38,6 +36,10 @@
    private static String isHoliday = "1-1,1-28,1-29,1-30,1-31,2-1,2-2,2-3,2-4,"
            +"4-4,4-5,4-6,5-1,5-2,5-3,5-4,5-5,5-31,6-1,6-2,10-1,10-2,10-3,"
            +"10-4,10-5,10-6,10-7,10-8";
    // 线程安全的格式化器(全局静态)
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm");
    /**
     * 获取两个时间内,除去周末周日以及法定节假日的 小时总数。
@@ -309,4 +311,73 @@
        LocalDateTime of = LocalDateTime.of(localDateTime.getYear(), localDateTime.getMonth(), localDateTime.getDayOfMonth(), 23, 59, 59);
        return Timestamp.valueOf(of);
    }
    /**
     * 获取指定时间所在月份的开始时间(当月1日 00:00:00)
     * @param date 任意时间(可为null,默认取当前时间)
     * @return 当月开始时间
     */
    public static Date getMonthStartTime(Date date) {
        Calendar calendar = Calendar.getInstance();
        // 若传入时间为null,使用当前时间
        if (date != null) {
            calendar.setTime(date);
        }
        // 设置为当月1日
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        // 设置为00:00:00
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0); // 毫秒置0,避免时间偏差
        return calendar.getTime();
    }
    /**
     * 获取指定时间所在月份的结束时间(当月最后一日 23:59:59)
     * @param date 任意时间(可为null,默认取当前时间)
     * @return 当月结束时间
     */
    public static Date getMonthEndTime(Date date) {
        Calendar calendar = Calendar.getInstance();
        if (date != null) {
            calendar.setTime(date);
        }
        // 设置为当月最后一天
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        // 设置为23:59:59
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999); // 毫秒置999,覆盖所有毫秒数
        return calendar.getTime();
    }
    /**
     * 拆分Date为年月日和时分字符串
     * @param date 待拆分的Date(可为null)
     * @return Map:key=date(年月日)、time(时分),值为对应字符串;null返回空字符串
     */
    public static Map<String, String> splitDateToDateAndTime(Date date) {
        Map<String, String> result = new HashMap<>();
        if (date == null) {
            result.put("date", "");
            result.put("time", "");
            return result;
        }
        // Date转LocalDateTime(处理时区)
        LocalDateTime localDateTime = LocalDateTime.ofInstant(
                date.toInstant(),
                ZoneId.systemDefault() // 用系统默认时区,避免时差
        );
        // 拆分年月日和时分
        String dateStr = DATE_FORMATTER.format(localDateTime);
        String timeStr = TIME_FORMATTER.format(localDateTime);
        result.put("date", dateStr);
        result.put("time", timeStr);
        return result;
    }
}