java 1.8 sql,JDK1.8 中 java.sql包下时间类的坑

JDK1.8 中 java.sql.Time\Date\TimeStamp均存在不同程度的坑;

Time没有记录日期,调用getYear会抛出异常;

Time有关日期的操作都会抛出异常;

Date则没有记录时间,调用getHours会抛出异常;

时间相关的操作都会抛出异常;

Timestamp问题最大,因为其本身对util包中的Date做了扩展,Date无法正常的理解Timestamp的行为,导致出现意料之外的结果;

Timestamp继承自Date,精确到毫秒,但是将毫秒(秒以下)存入 nanos 成员变量中;这是Timestamp的成员变量,Date自然不能理解其行为,但因为其将毫秒也放到了nanos中,这就导致了Date的after一类的方法时,传参如果是Timestamp,将无法获取到其毫秒(被截断),所以after的结果可能是对的,可能是错误的;如下代码:

Date date = new Date();

Timestamp stamp = new Timestamp(date.getTime()+500);

System.out.println(date.after(stamp));

结果可能是true也可能是false,这完全取决于当new Date时,date的毫秒数是否大于500,如果大于500,再+500就成了1000,即变成了s,对于毫秒的截断不影响最终的结果,如果小于500,因为截断了毫秒,结果反而date比stamp要大,结果就变成了true;这点可以看Timestamp的构造函数:

public Timestamp(long time) {

super((time/1000)*1000);

nanos = (int)((time%1000) * 1000000);

if (nanos < 0) {

nanos = 1000000000 + nanos;

super.setTime(((time/1000)-1)*1000);

}

}

个人认为这是典型的违反了 里氏替换原则导致的问题;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值