淘先锋技术网

首页 1 2 3 4 5 6 7

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);

}

}

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