JDK1.8 中 java.sql.Time\Date\TimeStamp均存在不同程度的坑邑退;
Time沒有記錄日期,調(diào)用getYear會(huì)拋出異常熬苍;
Time有關(guān)日期的操作都會(huì)拋出異常稍走;
Date則沒有記錄時(shí)間,調(diào)用getHours會(huì)拋出異常柴底;
時(shí)間相關(guān)的操作都會(huì)拋出異常婿脸;
Timestamp問題最大,因?yàn)槠浔旧韺?duì)util包中的Date做了擴(kuò)展似枕,Date無法正常的理解Timestamp的行為盖淡,導(dǎo)致出現(xiàn)意料之外的結(jié)果;
Timestamp繼承自Date凿歼,精確到毫秒褪迟,但是將毫秒(秒以下)存入 nanos 成員變量中冗恨;這是Timestamp的成員變量,Date自然不能理解其行為味赃,但因?yàn)槠鋵⒑撩胍卜诺搅薾anos中掀抹,這就導(dǎo)致了Date的after一類的方法時(shí),傳參如果是Timestamp心俗,將無法獲取到其毫秒(被截?cái)啵┌廖洌詀fter的結(jié)果可能是對(duì)的,可能是錯(cuò)誤的城榛;如下代碼:
Date date = new Date();
Timestamp stamp = new Timestamp(date.getTime()+500);
System.out.println(date.after(stamp));
結(jié)果可能是true也可能是false揪利,這完全取決于當(dāng)new Date時(shí),date的毫秒數(shù)是否大于500狠持,如果大于500疟位,再+500就成了1000,即變成了s喘垂,對(duì)于毫秒的截?cái)嗖挥绊懽罱K的結(jié)果甜刻,如果小于500,因?yàn)榻財(cái)嗔撕撩胝眨Y(jié)果反而date比stamp要大得院,結(jié)果就變成了true;這點(diǎn)可以看Timestamp的構(gòu)造函數(shù):
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);
}
}
個(gè)人認(rèn)為這是典型的違反了 里氏替換原則導(dǎo)致的問題章贞;