簡體   English   中英

java.sql.Timestamp是否提供有用的納秒精度?

[英]Does java.sql.Timestamp provide nanosecond precision that is useful?

我運行了一個簡單的測試來創建一百萬個時間對象,並測試了以下內容

 int nano = new Timestamp(new Date().getTime()).getNanos();
 if((nano & 0x00000000003F) != 0x0) {
    System.out.println("Nano from timestamp : " +  nano);
 }

沒有任何輸出表示最后的最低有效6位全為零。 那么,時間戳是否僅取決於System.currentTimeMillis()返回的值並將其乘以1000000?

時間戳是否具有納秒精度有用? 在當前情況下,由於我沒有得到任何非零值,這意味着精度僅降低到毫秒(而不是納秒)。

那么使用時間戳記有什么好處?

java.sql.Timestamp類型使用單獨的字段具有納秒級的精度,如記錄所示:

注意:此類型是java.util.Date和單獨的納秒值的組合。 僅整數秒存儲在java.util.Date組件中。 小數秒- nanos -是分開的。

您正在使用java.util.Date.getTime()設置時間戳記值,該值僅提供毫秒精度: “返回自此Date對象表示的1970年1月1日格林尼治標准時間00:00:00以來的毫秒數。” ; 該毫秒值的亞秒值存儲在nanos字段中,換句話說,nanos的亞毫秒值以此方式為零。

如果要使用納秒精度,則需要分別設置和獲取納秒(使用setNanosgetNanos ),或者需要使用Timestamp.valueOf(java.time.LocalDateTime)從具有納秒精度的類型( java.time.LocalDateTime )構造它。 Timestamp.valueOf(java.time.LocalDateTime)

鑒於nanos存儲了所有小數秒,使用setNanos有一些警告,另請參見java.sql.Timestamp存儲NanoSeconds的方式的一些答案

這就是說,只有您所使用的數據庫真正支持這種納秒精度時,您才能從中受益。 例如,我維護了Firebird的JDBC驅動程序,而Firebird僅支持100微秒精度,而不支持納秒精度,而PostgreSQL例如支持微秒精度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM