chengf
2026-01-27 b6184e2ddf3db37a94f7efb3b619bbc64642a292
java110-utils/src/main/java/com/java110/utils/util/DateUtil.java
@@ -6,6 +6,10 @@
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.util.*;
/**
@@ -16,6 +20,11 @@
    private static DateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmmss");
    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 Map<String, SimpleDateFormat> formats = new HashMap();
    public static final String DATE_FORMATE_STRING_DEFAULT = "yyyyMMddHHmmss";
@@ -36,6 +45,7 @@
    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 {
@@ -513,15 +523,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);
@@ -1016,4 +1018,52 @@
        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"));
    }
}