JAVA日期判断踩坑

本文揭示了在Java中使用Date对象的getYear(), getMonth(), getDay()方法进行日期比较时存在的陷阱,这些方法返回的数值并不直观且已废弃。通过对比示例,文章详细解释了为何直接比较这些数值会得出错误结论,并提供了使用Calendar类进行正确日期比较的有效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:
判断一下某个当前日期是不是结束日期。

package date;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTest {
    public static void main(String[] args) throws ParseException {
        Date nowDay = new Date();

        String dateStr = "2019-02-01 23:52:40";
        SimpleDateFormat sdf =   new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );

        Date endDate = sdf.parse(dateStr);

        String str = sdf.format(new Date());
        System.out.println("nowdate:"+str);

        //判断结束时间是否是今天
        if(nowDay.getYear() == endDate.getYear() && nowDay.getMonth() == endDate.getMonth() && nowDay.getDay() == endDate.getDay()){
            System.out.println("is endDate: true");
        }
    }
}



输出:
nowdate:2019-02-15 10:30:24
is endDate: true

一开始单纯的以为这样直接判断年月日数值相等就是了,结果发现getYear()之类的方法返回的数值已经不是正常的年份。

public class DateTest {
    public static void main(String[] args) throws ParseException {
        Date nowDay = new Date();

        String dateStr = "2019-02-01 23:52:40";
        SimpleDateFormat sdf =   new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );

        Date endDate = sdf.parse(dateStr);

        String str = sdf.format(new Date());
        System.out.println("nowdate:"+str);

        System.out.println("nowdate year:"+nowDay.getYear()+" monther:"+nowDay.getMonth()+" day:"+nowDay.getDay());
        System.out.println("enddate year:"+endDate.getYear()+" monther:"+endDate.getMonth()+" day:"+endDate.getDay());
        //判断结束时间是否是今天
        if(nowDay.getYear() == endDate.getYear() && nowDay.getMonth() == endDate.getMonth() && nowDay.getDay() == endDate.getDay()){
            System.out.println("is endDate: true");
        }
    }
}

输出:
nowdate:2019-02-15 10:34:21
nowdate year:119 monther:1 day:5
enddate year:119 monther:1 day:5
is endDate: true

2019-02-15 与 2019-02-01返回的数值相等,为什么呢?
查看源码:
getYear():

@Deprecated
    public int getYear() {
        return normalize().getYear() - 1900;
    }

getMonth()

 @Deprecated
    public int getMonth() {
        return normalize().getMonth() - 1; // adjust 1-based to 0-based
    }

getDay():

 @Deprecated
    public int getDay() {
        return normalize().getDayOfWeek() - BaseCalendar.SUNDAY;
    }

原来getDay()发放是以周为一个循环,2-1 和 2-15 都是星期五。故判断是相等。

解决办法:

使用calendar判断:

package date;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateTest {
    public static void main(String[] args) throws ParseException {
        Date nowDay = new Date();

        String dateStr = "2019-02-01 23:52:40";
        SimpleDateFormat sdf =   new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );

        Date endDate = sdf.parse(dateStr);

        String str = sdf.format(new Date());
        System.out.println("nowdate:"+str);

        System.out.println("nowdate year:"+nowDay.getYear()+" monther:"+nowDay.getMonth()+" day:"+nowDay.getDay());
        System.out.println("enddate year:"+endDate.getYear()+" monther:"+endDate.getMonth()+" day:"+endDate.getDay());

        //判断结束时间是否是今天
//        if(nowDay.getYear() == endDate.getYear() && nowDay.getMonth() == endDate.getMonth() && nowDay.getDay() == endDate.getDay()){
//            System.out.println("is endDate: true");
//        }

        if(isSameDate(nowDay,endDate)){
            System.out.println("is endDate: true");
        }else{
            System.out.println("is endDate: false");
        }
    }

    private static boolean isSameDate(Date date1, Date date2) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date1);

        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(date2);

        boolean isSameYear = cal1.get(Calendar.YEAR) == cal2
                .get(Calendar.YEAR);

        System.out.println("nowdate year:"+cal1.get(Calendar.YEAR)+" enddate year:"+cal2.get(Calendar.YEAR));
        boolean isSameMonth = isSameYear
                && cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH);
        System.out.println("nowdate month:"+cal1.get(Calendar.MONTH)+" enddate month:"+cal2.get(Calendar.MONTH));

        boolean isSameDate = isSameMonth
                && cal1.get(Calendar.DAY_OF_MONTH) == cal2
                .get(Calendar.DAY_OF_MONTH);

        System.out.println("nowdate day:"+cal1.get(Calendar.DAY_OF_MONTH)+" enddate day:"+cal2
                .get(Calendar.DAY_OF_MONTH));

        return isSameDate;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值