You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java SE 1.6中忽略年份的日期匹配实现需求(仅校验月日)

在Java SE 1.6中判断两个Date是否为同月同日(独立于年份)

嘿,这个需求我太懂了!要在Java 1.6里实现两个日期的同月同日判断(完全不考虑年份),还要处理闰年的特殊情况,核心思路就是避开年份的干扰,只提取并对比两个日期的月份编号和当月日期。因为Java 1.6还没有Java 8+的LocalDate这类更易用的日期API,我们只能用Calendar类来处理,下面给你两种实用的实现方案:

方案一:严格匹配月份和当月日期

这个方案会严格校验两个日期的月份(注意Calendar的月份是0-based,1月为0,12月为11)和当月的日期数,完全不考虑年份,适合要求严格匹配的场景:

import java.util.Calendar;
import java.util.Date;

public class DateComparisonUtils {
    /**
     * 判断两个Date是否为同月同日(独立于年份,严格匹配)
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 若同月同日返回true,否则返回false
     * @throws IllegalArgumentException 若任一日期为null
     */
    public static boolean isSameMonthAndDay(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            throw new IllegalArgumentException("日期参数不能为null");
        }
        
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date1);
        
        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(date2);
        
        // 对比月份和当月日期
        boolean sameMonth = cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH);
        boolean sameDay = cal1.get(Calendar.DAY_OF_MONTH) == cal2.get(Calendar.DAY_OF_MONTH);
        
        return sameMonth && sameDay;
    }
}

举个例子:

  • 2020年2月29日 和 2024年2月29日 → 返回true
  • 2020年2月29日 和 2023年2月28日 → 返回false

方案二:兼容闰年2月29日的生日场景

如果是用来判断生日(比如用户生日是2月29日,非闰年时希望把2月28日视为生日),可以在严格匹配的基础上增加闰年兼容逻辑:

import java.util.Calendar;
import java.util.Date;

public class DateComparisonUtils {
    /**
     * 判断当前日期是否为指定生日(兼容闰年2月29日的情况)
     * @param birthday 用户的生日Date对象
     * @param currentDate 需要校验的当前日期
     * @return 若为生日(含闰年兼容)返回true,否则返回false
     * @throws IllegalArgumentException 若任一日期为null
     */
    public static boolean isBirthday(Date birthday, Date currentDate) {
        if (birthday == null || currentDate == null) {
            throw new IllegalArgumentException("日期参数不能为null");
        }
        
        Calendar birthCal = Calendar.getInstance();
        birthCal.setTime(birthday);
        
        Calendar currentCal = Calendar.getInstance();
        currentCal.setTime(currentDate);
        
        // 先判断严格的同月同日匹配
        if (birthCal.get(Calendar.MONTH) == currentCal.get(Calendar.MONTH) 
            && birthCal.get(Calendar.DAY_OF_MONTH) == currentCal.get(Calendar.DAY_OF_MONTH)) {
            return true;
        }
        
        // 处理闰年2月29日的特殊情况:非闰年时2月28日视为匹配2月29日的生日
        boolean isBirthLeapDay = birthCal.get(Calendar.MONTH) == Calendar.FEBRUARY 
                                 && birthCal.get(Calendar.DAY_OF_MONTH) == 29;
        boolean isCurrentFeb28 = currentCal.get(Calendar.MONTH) == Calendar.FEBRUARY 
                                 && currentCal.get(Calendar.DAY_OF_MONTH) == 28;
        boolean isCurrentYearNotLeap = !currentCal.isLeapYear(currentCal.get(Calendar.YEAR));
        
        return isBirthLeapDay && isCurrentFeb28 && isCurrentYearNotLeap;
    }
}

这个方法会:

  • 正常匹配所有同月同日的情况
  • 当生日是2月29日,且当前年份不是闰年、当前日期是2月28日时,也返回true,更符合实际的生日判断需求。

注意事项

  1. Calendar的MONTH字段是0-based的(1月=0,12月=11),不需要额外转换,直接对比即可
  2. 两个方法都完全兼容Java SE 1.6,且可以在任意年份复用,因为完全不依赖固定年份的逻辑
  3. 记得处理null参数的情况,避免空指针异常

内容的提问来源于stack exchange,提问作者Ale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:17:53