2017-10-30 17 views
0

ここでは、forループの各繰り返しでDateに対して異なる値を生成する必要があります。各繰り返しごとに異なる日付を生成

currentTimeMillisを使用すると、同じ時間が得られますが、nanoTimeは間違った日付を返します。


Tue Feb 09 09:56:54 IST 2292 
Tue Feb 09 09:57:39 IST 2292 
Tue Feb 09 09:58:10 IST 2292 
Tue Feb 09 09:58:50 IST 2292 
Tue Feb 09 09:59:24 IST 2292 
Tue Feb 09 09:59:53 IST 2292 
Tue Feb 09 10:00:29 IST 2292 
Tue Feb 09 10:00:59 IST 2292 
Tue Feb 09 10:01:37 IST 2292 
Tue Feb 09 10:02:18 IST 2292 

UPDATE


Mon Oct 30 19:33:43 IST 2017 
Mon Oct 30 19:33:43 IST 2017 
Mon Oct 30 19:33:43 IST 2017 
Mon Oct 30 19:33:43 IST 2017 
Mon Oct 30 19:33:43 IST 2017 
Mon Oct 30 19:33:43 IST 2017 
Mon Oct 30 19:33:43 IST 2017 
Mon Oct 30 19:33:43 IST 2017 
Mon Oct 30 19:33:43 IST 2017 
Mon Oct 30 19:33:43 IST 2017 

for (int i = 0; i < 10; i++) { 
     System.out.println(new Date(System.currentTimeMillis())); 
    } 

    for (int i = 0; i < 10; i++) { 
     System.out.println(new Date(System.nanoTime())); 
    } 
:と反復ごとに異なるタイムスタンプを生成する必要が異なるレコードがユニークなタイムスタンプを持っている必要がありカサンドラデータベースに起こっています。それ以外の場合は、お互いを上書きします。また、forループで秒を追加すると問題は解決しますが、偽のtime.Adding睡眠は残念なことにオプションはありませんコードはできるだけ早くレコードを追加して終了する必要があります

+0

System.currentTimeMillis()を使用して最初の例でミリ秒を印刷しないのはなぜですか?日付が同じでない可能性があります – NAIT

+0

最初のforループが速すぎます。各反復の間にかなりの時間がないので、同じ時間が得られます。それが1秒以上実行され、時間の変化がわずかに見えるはずです。 –

+1

したがって、これらの日付がどのように定義されているかを除いて、それらの日付は異なる必要はありませんか? 3000年の日付は大丈夫でしょうか?あなたはここで何を達成しようとしていますか? –

答えて

1

であなたが日付を初期化している時間をインクリメントしてみてください他の場合は、ループ内の任意の量だけ日付を手動で増やすことができます。

Java 8以上を使用している場合は、古いjava.util.Date APIを使用せずに、java.timeを使用することをおすすめします。

Instant instant = Instant.now(); 
for (int i = 0; i < 10; i++) 
{ 
    System.out.println(instant.toString()); 
    // Choose whatever interval size you need in your specific case. 
    instant = instant.plus(1, ChronoUnit.MILLIS); 
} 

あなたが本当にDate.from(instant)を使用してする必要がある場合は、まだ戻ってDateオブジェクトに変換することができます。

編集:更新された要件を見て、私は今私の答えを調整しました。

  • システムクロックの分解能

    は、あなたが知っておく必要があるいくつかの制限があります あなたはミリ秒各反復でを追加することによって、周りに手動で(たとえば、いくつかの日付を偽造得ることはありませんループ)は、システムクロックの分解能が正確ではなく、各呼び出しで異なるタイムスタンプを生成するためです。データベース内の列の

  • データ型: データベースは、多くの場合、彼らだけが格納できる日付値のための限られた精度を持っています。たとえば、オラクルの古いDateデータ型では、精度は秒まで、小数は格納できません。私は、MS SQLServerのDateTime型がミリ秒を1秒のうちの最も近い1/3に丸めると信じています。

  • Javaデータ型の精度: 古いjava.util.Dateタイプのみの精度をミリ秒まで保存することができます。 java.time.Instantには、ナノ秒も格納できます。 Java 8のJDBCには、Dateの代わりにInstantを使用する一致するメソッドが付属していますが、実際のデータベースとJDBCドライバの実装ではもちろん、その精度も実際にサポートする必要があります。

4

ノートそのnanoはmilliよりも大きな価値をもたらし、ミリ秒の代わりにnanosecondsの値を渡すので、奇妙な結果になります。 1970年1月1日00:00:00 GMTからのミリ秒 -

日を期待して何Date(long date)コンストラクタ

を返すことはナノ秒単位で、実行中のJava仮想マシンの高分解能タイムソースの現在の値を返します。何nanoTime

nanoTimeは、Date()にはまったく関連していません。これは、異なる目的を達成するために設計され、実装されています。

この方法は、経過時間を測定するために使用することができ、システムまたは壁時計時間の他の概念に関連していません。返される値は、固定ではあるが任意の起点時刻(おそらく将来的には値が負になる可能性があるため)からナノ秒を表します。 Java仮想マシンのインスタンスでは、このメソッドのすべての呼び出しで同じ起点が使用されます。他の仮想マシンインスタンスは異なる起点を使用する可能性があります。ここで


は、forループの各反復で日付ごとに異なる値を生成するために必要な。

おそらくあなたは値を追加することによって、現在の日付に分/日で時間を追加してみてくださいすることができますか?

2

最初のコードスニペットが正常に動作しています。ループ内のすべてのステップが同時に実行されます。あなたはその後、別の時間をしたい場合は、実行中のスレッドsleep

for (int i = 0; i < 10; i++) { 
    System.out.println(new Date(System.currentTimeMillis())); 
    Thread.sleep(1000); 
} 

次を与える:

Mon Oct 30 10:10:10 EDT 2017 
Mon Oct 30 10:10:11 EDT 2017 
Mon Oct 30 10:10:12 EDT 2017 
Mon Oct 30 10:10:13 EDT 2017 
Mon Oct 30 10:10:14 EDT 2017 
Mon Oct 30 10:10:15 EDT 2017 
Mon Oct 30 10:10:16 EDT 2017 
Mon Oct 30 10:10:17 EDT 2017 
Mon Oct 30 10:10:18 EDT 2017 
Mon Oct 30 10:10:19 EDT 2017 

2番目のコードスニペットは、日付がコンストラクタでミリ秒を期待しているという点で間違っています。 nanoTime()は実際

として、デルタを取得するために使用されるべき値が返される(値は負であってもよいので、おそらく将来的に)いくつかの固定されたが、任意の時間のでナノ秒を表します。

0

new Date(long time)gives a date based on milliseconds - それはそれは間違った日付を与えているということではありませんSystem.nanoTime()を約1000倍に正しい時間である一方で、それは

System.currentTimeMillis()与えられた間違った時間のための正しい日付は(、日付の正確な時刻を与えています

)ミリ秒単位では、new Date(System.currentTimeMillis())オーバーnew Date()を使用する方が簡単かもしれas they will both give the current time to the closest millisecond


あなたの目標は、同様の日付を取得する場合、唯一の要件は、日付がそれぞれ異なっているということであれば代わりに(この場合は1秒の違い)

long now = System.currentTimeMillis(); 
for(int i = 0; i < 10; i++) 
    System.out.println(new Date(now + i * 1000)); 
+0

の代わりにjava.time APIを使用してください。主な問題は、出力にはミリ秒ではなく、 –

+0

@ Code-Apprentice OPが、ループが複数ミリ秒かかるのに十分な速度のコンピュータを使用していますか? – phflack

関連する問題