免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

為什么阿里Java開發(fā)手冊不推薦使用Timestamp

開發(fā)手冊

為什么阿里Java開發(fā)手冊不推薦使用Timestamp

文章插圖
不推薦用java.sql.Date、java.sql.Time網(wǎng)上說的文章有很多 。
參考文章:一文告訴你Java日期時間API到底有多爛
但為什么不推薦使用java.sql.Timestamp文章比較少 。
原因Oracle官網(wǎng)文檔中這么寫:
為什么阿里Java開發(fā)手冊不推薦使用Timestamp

文章插圖
可以看到,根源是因為java.sql.Timestamp父類java.sql.DatefastTime屬性存儲秒,而java.sql.Timestampnanos存儲秒以外的毫秒 。所以秒和毫秒是分別存儲的,從Timestamp的構(gòu)造方法也可以看出來:
public Timestamp(long time) { // 設(shè)置java.sql.Date的fastTime super((time/1000)*1000); // 設(shè)置java.sql.Timestamp的nanos if (nanos < 0) {nanos = 1000000000 + nanos;super.setTime(((time/1000)-1)*1000); }}所以會有什么問題呢?
  1. equals的問題
【為什么阿里Java開發(fā)手冊不推薦使用Timestamp】The Timestamp.equals(Object) method never returns true when passed an object that isn't an instance of java.sql.Timestamp, because the nanos component of a date is unknown.

為什么阿里Java開發(fā)手冊不推薦使用Timestamp

文章插圖
可能程序員會想,我兩個時間都是從一個millis中創(chuàng)建的,那時間應(yīng)該是一樣的 。但是因為Timestamp的設(shè)計,它們的值不相等 。
  1. after的問題

為什么阿里Java開發(fā)手冊不推薦使用Timestamp

文章插圖
期待的答案應(yīng)該是false 。原因是:
public boolean after(Date when) {return getMillisOf(this) > getMillisOf(when);}static final long getMillisOf(Date date) {if (date.cdate == null || date.cdate.isNormalized()) {return date.fastTime;}BaseCalendar.Date d = (BaseCalendar.Date) date.cdate.clone();return gcal.getTime(d);}date對象的fastTime值為:1664429777371timestamp對象的fastTime值為:1664429777000看一下Timestamp的構(gòu)造方法:
public Timestamp(long time) { // 設(shè)置java.sql.Date的fastTime super((time/1000)*1000); // 設(shè)置java.sql.Timestamp的nanos if (nanos < 0) {nanos = 1000000000 + nanos;super.setTime(((time/1000)-1)*1000); }}可以知道timestamp對象的fastTime的后三位為0 。
而看Date的構(gòu)造方法:
public Date(long date) {fastTime = date;}它是直接把傳入的值賦值給fastTime 。
總結(jié)不將java.sql.Timestamp和其它java.util.Date的對象比較 。

    經(jīng)驗總結(jié)擴(kuò)展閱讀