網頁

2020/6/5

Java java.sql.Timestamp簡介

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.Timestampequals(Object ts)的比較對象僅限於同類別,也就是與父類物件比較的結果總是false; 且java.sql.TimestamphashCode()沒有另外實作,僅以super.hashCode()呼叫父類java.util.DatehashCode(),不計算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();
    }

    ...
}

沒有留言:

張貼留言