【原创】如何正确比较日期 java.sql.Date

import java.sql.Date;
.....
....
...
..
.
例如今天是2010-12-2
Date d1 = new Date(System.currentTimeMili());
Date d2 = new Date(System.currentTimeMili()+1);//比d1晚1毫秒
日期上,我们认为d1和d2是相等的
但是

System.out.println(d1.before(d2));

输出结果是true;

其实我们希望看到的是这两个对象在日期上是相等的。
因为我们只关心“日期”,而“2010-12-2”不等于“2010-12-2”
这个结果显然是我们所不能接受的。

究其原因,是因为Date内封装了一个精确到毫秒的表示时间的
private transient long fastTime;

而before和after的函数的实现如下,都是判断fastTime的值,所以达不到我们只比较日期的要求。
    public boolean before(Date when) {
        return getMillisOf(this) < getMillisOf(when);
    }
    public boolean after(Date when) {
        return getMillisOf(this) > getMillisOf(when);
    }

那么,如何比较日期呢?
思路当然是把日期格式成标准的“年月日”,然后对格式化后的对象进行比较,得到比较的结果
本文给出一种“格式成标准化”的方式
Date d1_temp = java.sql.Date.valueOf(d1.toString());
Date d2_temp = java.sql.Date.valueOf(d2.toString());
System.out.prinltn(d1_temp.equals(d2_temp));//输出结果是true;
System.out.prinltn(d1_temp.before(d2_temp));//输出结果是false;
System.out.prinltn(d1_temp.after(d2_temp));//输出结果是false;

需要逻辑的话,可以写成
if(d1_temp.before(d2_temp)){
.........
}

本文结束。

PS:用文本方式转格式,日期会向前回滚一天,但是无所谓,两个都转格式之后,我们只需要知道它们之间的先后关系,无需用转换后的日期做运算。所以,可以放心使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值