jialh
1 天以前 dd6687b118561100e1677e88a9c2f5842a54c531
java110-utils/src/main/java/com/java110/utils/util/DateUtil.java
@@ -5,21 +5,51 @@
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.*;
/**
 * Created by wuxw on 2017/7/24.
 */
public class DateUtil {
    public static final String DATE_FORMATE_STRING_MILLI = "yyyyMMddHHmmssSSS"; // 17位:年月日时分秒毫秒
    private static DateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmmss");
    public static final String LAST_TIME = "2038-01-01 00:00:00";
    public static final String LAST_TIME = "2050-01-01 00:00:00";
    public static int getTotalDaysInMonth(int year, int month) {
        LocalDate date = LocalDate.of(year, month, 1); // 创建一个日期对象,年份和月份为指定值,日期为1号
        return date.lengthOfMonth(); // 返回该月的天数
    }
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    public static boolean isValidDate(String dateStr) {
        // ✅ 关键修复:先彻底去除前后空白(包括空格、制表符、换行)
        if (dateStr == null || dateStr.isEmpty()) {
            return true;
        }
        // 去掉所有空白后再校验
        String cleanDate = dateStr.trim();
        try {
            LocalDate.parse(cleanDate, DATE_FORMATTER);
            return true;
        } catch (DateTimeParseException e) {
            return false;
        }
    }
    private static Map<String, SimpleDateFormat> formats = new HashMap();
    public static final String DATE_FORMATE_STRING_DEFAULT = "yyyyMMddHHmmss";
    public static final String DATE_FORMATE_STRING_A = "yyyy-MM-dd HH:mm:ss";
    public static final String DATE_FORMATE_STRING_B = "yyyy-MM-dd";
    public static final String DATE_FORMATE_STRING_SLASH_NON_ZERO = "yyyy/M/d";
    public static final String DATE_FORMATE_STRING_C = "MM/dd/yyyy HH:mm:ss a";
    public static final String DATE_FORMATE_STRING_D = "yyyy-MM-dd HH:mm:ss a";
    public static final String DATE_FORMATE_STRING_E = "yyyy-MM-dd'T'HH:mm:ss'Z'";
@@ -34,12 +64,14 @@
    public static final String DATE_FORMATE_STRING_N = "HHmmss";
    public static final String DATE_FORMATE_STRING_O = "yyyyMMddHHmm";
    public static final String DATE_FORMATE_STRING_Q = "yyyy-MM";
    private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    static {
        formats.put("yyyyMMddHHmmss", new SimpleDateFormat("yyyyMMddHHmmss"));
        formats.put("yyyy-MM-dd HH:mm:ss", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        formats.put("yyyy-MM-dd", new SimpleDateFormat("yyyy-MM-dd"));
        formats.put("yyyy/MM/dd", new SimpleDateFormat("yyyy/M/d"));
        formats.put("MM/dd/yyyy HH:mm:ss a", new SimpleDateFormat("MM/dd/yyyy HH:mm:ss a"));
        formats.put("yyyy-MM-dd HH:mm:ss a", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a"));
        formats.put("yyyy-MM-dd'T'HH:mm:ss'Z'", new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"));
@@ -412,15 +444,19 @@
    public static Date getNextMonthFirstDate(Date curDate) {
        return getNextMonthFirstDate(curDate, 1);
    }
    public static Date getNextMonthFirstDate(Date curDate, int monthCount) {
        Calendar curDateCal = Calendar.getInstance();
        curDateCal.setTime(curDate);
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.add(Calendar.MONTH, 1);
        return calendar.getTime();
        curDateCal.set(Calendar.DAY_OF_MONTH, 1);
        curDateCal.set(Calendar.HOUR_OF_DAY, 0);
        curDateCal.set(Calendar.MINUTE, 0);
        curDateCal.set(Calendar.SECOND, 0);
        curDateCal.add(Calendar.MONTH, monthCount);
        return curDateCal.getTime();
    }
    public static Date getFirstDate() {
@@ -506,15 +542,7 @@
        return a.getActualMaximum(Calendar.DAY_OF_MONTH);
    }
    public static void main(String[] args) throws ParseException {
//        SimpleDateFormat sf = new SimpleDateFormat(DateUtil.DATE_FORMATE_STRING_A);
//        Calendar c = Calendar.getInstance();
//        c.setTime(DateUtil.getDateFromString("2021-12-03",DateUtil.DATE_FORMATE_STRING_A));
//        c.add(Calendar.DAY_OF_MONTH, 125);
//        System.out.println("增加一天后日期:"+sf.format(c.getTime()));
        System.out.println("2021-12-07".compareTo(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_B)));
    }
    public static String getAddDayString(Date date, String pattern, int days) {
        SimpleDateFormat sf = new SimpleDateFormat(pattern);
@@ -813,16 +841,39 @@
        return calendar.getTime();
    }
    /**
     * 除去 小时 分 秒
     *
     * deadtime 本来就少了一秒
     *
     * @param time
     * @return
     */
    public static Date deadTimeToDate(Date time) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        calendar.add(Calendar.SECOND,1);
        setTimeToMidnight(calendar);
        return calendar.getTime();
    }
    public static boolean sameMonthDay(Date startDate, Date endDate) {
        Calendar startCalendar = Calendar.getInstance();
        startCalendar.setTime(startDate);
        Calendar endCalender = Calendar.getInstance();
        endCalender.setTime(endDate);
        if (startCalendar.get(Calendar.DAY_OF_MONTH) == endCalender.get(Calendar.DAY_OF_MONTH)) {
        if (
                startCalendar.get(Calendar.DAY_OF_MONTH) == endCalender.get(Calendar.DAY_OF_MONTH)
                        && startCalendar.get(Calendar.HOUR_OF_DAY) == endCalender.get(Calendar.HOUR_OF_DAY)
        ) {
            return true;
        }
        return false;
    }
    public static double dayCompare(Date fromDate, Date toDate) {
        return dayCompare(fromDate, toDate, false);
    }
    /**
@@ -834,7 +885,14 @@
     * @param toDate
     * @return
     */
    public static double dayCompare(Date fromDate, Date toDate) {
    public static double dayCompare(Date fromDate, Date toDate, boolean plusOneSec) {
        if (plusOneSec) {
            Calendar toD = Calendar.getInstance();
            toD.setTime(toDate);
            toD.add(Calendar.SECOND, 1);
            toDate = toD.getTime();
        }
        //todo 需要计算三端时间 相加即可
@@ -848,6 +906,8 @@
        Calendar fromDateCal = Calendar.getInstance();
        fromDateCal.setTime(fromDate);
        fromDateCal.set(Calendar.DAY_OF_MONTH, 1);
        fromDateCal.set(Calendar.HOUR_OF_DAY, 0);
        fromDateCal.set(Calendar.MINUTE, 0);
        if (fromDate.getTime() > fromDateCal.getTime().getTime()) {
            fromDateCal.add(Calendar.MONTH, 1);
            firstDay = false;
@@ -858,6 +918,9 @@
        Calendar toDateCal = Calendar.getInstance();
        toDateCal.setTime(toDate);
        toDateCal.set(Calendar.DAY_OF_MONTH, 1);
        toDateCal.set(Calendar.HOUR_OF_DAY, 0);
        toDateCal.set(Calendar.MINUTE, 0);
        if (toDate.getTime() > toDateCal.getTime().getTime()) {
            toDateFirstDate = toDateCal.getTime();
        }
@@ -910,4 +973,116 @@
        endDate.add(Calendar.HOUR_OF_DAY, hour.intValue());
        return endDate.getTime();
    }
    public static String getNextSecTime(String time) {
        Date tTime = getDateFromStringA(time);
        return getNextSecTime(tTime);
    }
    public static Date getNextSecDateTime(Date time) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        calendar.add(Calendar.SECOND, 1);
        return calendar.getTime();
    }
    public static String getNextSecTime(Date time) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        calendar.add(Calendar.SECOND, 1);
        return getFormatTimeStringA(calendar.getTime());
    }
    public static String getPreSecTime(String time) {
        Date tTime = getDateFromStringA(time);
        return getPreSecTime(tTime);
    }
    public static String getPreSecTime(Date time) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        calendar.add(Calendar.SECOND, -1);
        return getFormatTimeStringA(calendar.getTime());
    }
    public static Date getPreSecTime(Date time,int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        calendar.add(Calendar.MONTH,month);
        calendar.add(Calendar.SECOND, -1);
        return calendar.getTime();
    }
    public static String getPreSecTimeStr(Date time,int month) {
        return getFormatTimeStringB(getPreSecTime(time,month));
    }
    public static String calculateTimeDifference(Date start, Date end) {
        Duration duration = Duration.between(start.toInstant(), end.toInstant());
        long days = duration.toDays();
        long hours = duration.toHours() % 24;
        long minutes = duration.toMinutes() % 60;
        StringBuilder result = new StringBuilder();
        if (days > 0) {
            result.append(days).append("天");
        }
        if (hours > 0) {
            result.append(hours).append("时");
        }
        if (minutes > 0 || (days == 0 && hours == 0 && minutes == 0)) {
            result.append(minutes).append("分");
        }
        return result.toString();
    }
    /**
     * 计算两个字符串日期之间的月数(超过一个整月则+1)
     * @param startDateStr 开始日期字符串
     * @param endDateStr 结束日期字符串
     * @return 月数差
     */
    public static int calculateMonths(String startDateStr, String endDateStr) {
        startDateStr = dateTimeToDate(startDateStr);
        endDateStr = dateTimeToDate(endDateStr);
        // 解析时间字符串为LocalDateTime
        LocalDateTime start = LocalDateTime.parse(startDateStr + " 00:00:00", DEFAULT_FORMATTER);
        LocalDateTime end = LocalDateTime.parse(endDateStr + " 23:59:59", DEFAULT_FORMATTER);
        // 确保开始时间在结束时间之前
        if (start.isAfter(end)) {
            LocalDateTime temp = start;
            start = end;
            end = temp;
        }
        // 提取日期部分计算完整月数
        Period period = Period.between(start.toLocalDate(), end.toLocalDate());
        int fullMonths = period.getYears() * 12 + period.getMonths();
        // 计算完整月数后的目标时间(用于判断是否刚好整月)
        LocalDateTime targetTime = start.plusYears(period.getYears()).plusMonths(period.getMonths());
        // 判断实际结束时间是否超过目标时间(即存在额外时间)
        boolean hasExtraTime = end.isAfter(targetTime);
        // 有额外时间则加1个月
        if (hasExtraTime) {
            fullMonths++;
        }
        return fullMonths;
    }
    public static void main(String[] args) throws ParseException {
//        SimpleDateFormat sf = new SimpleDateFormat(DateUtil.DATE_FORMATE_STRING_A);
//        Calendar c = Calendar.getInstance();
//        c.setTime(DateUtil.getDateFromString("2021-12-03",DateUtil.DATE_FORMATE_STRING_A));
//        c.add(Calendar.DAY_OF_MONTH, 125);
//        System.out.println("增加一天后日期:"+sf.format(c.getTime()));
        System.out.println(calculateMonths("2025-02-01 00:00:00", "2025-02-28"));
    }
}