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);
}
}
个人认为这是典型的违反了 里氏替换原则导致的问题;