Java java.sql.Timestamp
簡介。
Java的java.sql.Timestamp
其實是繼承java.util.Date
的擴展類別,用來補足Date
缺少的納秒(nanoseconds)資訊。
java.sql.Timestamp
通常用來對映資料庫SQL的TIMESTAMP
欄位格式,精確度可到奈秒,也就是0.000000001(10-9)。
java.sql.Timestamp
的完整的時間秒資訊仍放在父類java.util.Date
中,java.sql.Timestamp
僅儲存納秒資訊nanos
。
而java.sql.Timestamp
的equals(Object ts)
的比較對象僅限於同類別,也就是與父類物件比較的結果總是false
; 且java.sql.Timestamp
的hashCode()
沒有另外實作,僅以super.hashCode()
呼叫父類java.util.Date
的hashCode()
,不計算nanos
,因此應把java.sql.Timestamp
物件和java.util.Date
物件視為不同。
節錄Java 8+的java.sql.Timestamp
原始碼如下。
public class Timestamp extends java.util.Date {
...
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);
}
}
public void setTime(long time) {
super.setTime((time/1000)*1000);
nanos = (int)((time%1000) * 1000000);
if (nanos < 0) {
nanos = 1000000000 + nanos;
super.setTime(((time/1000)-1)*1000);
}
}
public long getTime() {
long time = super.getTime();
return (time + (nanos / 1000000));
}
private int nanos; // 紀錄納秒(nanoseconds)資訊
...
public boolean equals(Timestamp ts) {
if (super.equals(ts)) {
if (nanos == ts.nanos) {
return true;
} else {
return false;
}
} else {
return false;
}
}
public boolean equals(java.lang.Object ts) {
if (ts instanceof Timestamp) {
return this.equals((Timestamp)ts);
} else {
return false;
}
}
@Override
public int hashCode() {
return super.hashCode();
}
...
}
沒有留言:
張貼留言