10

java.sql.Timestampコンストラクタは次のようになります。

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);
    }
}

基本的にミリ秒単位の時間を受け入れ、最後の3桁を抽出してナノにします。したがって、ミリ秒の値が1304135631 421の場合、Timestamp.getnanos()を 421000000として取得します。これは単純な計算です(最後に6つのゼロを追加します)...最適ではないようです。

より良い方法は、ナノ秒単位の時間を受け取り、そこからナノ秒の値を計算するTimestampコンストラクターである可能性があります。

以下のプログラムを実行すると、実際のナノ秒と、タイムスタンプによるナノ秒の計算方法によって返されるナノ秒の違いがわかります。

long a = System.currentTimeMillis();
    for(;;){
        long b = System.currentTimeMillis();
        Timestamp tm = new Timestamp(System.currentTimeMillis());
        System.out.println(tm.getTime());
        System.out.println(tm.getNanos());
        System.out.println("This is actual nanos" + System.nanoTime()%1000000000);
        System.out.println("--------------------------");
        if(b-a >= 1)
            break;
    }

したがって、タイムスタンプに関するすべての議論は、最大ナノ秒の時間を保存すると言っていますが、それほど正しくないようです。

4

4 に答える 4

10

ミリ秒単位の時間は、ナノ単位の時間を表すものではありません。もっと正確に言うと、それは不可能です。あなたはTimestamp#setNanos()本当のナノを設定するために使用することになっています。

long timeInMillis = System.currentTimeMillis();
long timeInNanos = System.nanoTime();

Timestamp timestamp = new Timestamp(timeInMillis);
timestamp.setNanos((int) (timeInNanos % 1000000000));

// ...
于 2011-04-30T04:41:26.503 に答える
3

の導入以来、:java.time.*に新しいファクトリメソッドがあります(ナノ秒の精度で)。逆に変換することもあります。java.sql.TimestampTimestamp.from(Instant.now())Timestamp.toInstant()

于 2017-03-31T11:56:40.537 に答える
0

古い投稿ですが、Timestampのドキュメントには、「小数秒をnanaosecondsの精度で指定できるようにすることで、小数秒を保持する」と記載されていることを付け加えておきます。紛らわしい部分は「ホールド」です。これは最初は紛らわしいように見えますが、正しく理解されていれば、実際にはnanaoseconds値を保持しているとは述べていません。小数値を「保持」し、ナノ秒の「精度」にすることができます。精度は、総桁数の表現の観点から理解する必要があります。つまり、基本的には、パーツが実際には分数(まだミリ秒)であるが、1000000を掛けてナノ秒として表すことを意味します。

受け入れられた答え(これまでに役立つBaluCによる)はそれをうまく要約しています。

于 2013-10-25T19:37:29.167 に答える
0

私はOpenJPAのTimestampHelperの実装が好きです。静的初期化子を使用して、タイムスタンプを作成するための呼び出し間の経過ナノ秒を追跡します。

于 2014-11-12T16:39:46.103 に答える