2017-10-30 1 views
0

Hier müssen in jeder Iteration der for-Schleife unterschiedliche Werte für Date generiert werden.Generieren Sie für jede Iteration ein anderes Datum

Die Verwendung von currentTimeMillis hilft nicht, da es die gleiche Zeit gibt, aber NanoTime gibt insgesamt falsches Datum.

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

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 

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: Need verschiedene Zeitstempel für jede Iteration als das zu erzeugen, ist in cassandra Datenbank zu gehen, wo verschiedene Datensätze eindeutige Zeitmarke haben müssen. Sonst überschreiben sie sich gegenseitig. Auch Zeit sollte nicht falsch sein, da das Hinzufügen einer zweiten in for-Schleife das Problem lösen würde, ist aber gefälschte Zeit. Hinzufügen von Schlaf ist leider keine Option, da der Code Datensätze so schnell wie möglich hinzufügen und

+0

Warum drucken Sie im ersten Beispiel keine Millisekunden mit System.currentTimeMillis()? Die Daten sind möglicherweise nicht identisch – NAIT

+0

Die erste for-Schleife iteriert zu schnell. Da zwischen jeder Iteration nicht genügend Zeit zur Verfügung steht, erhalten Sie die gleiche Zeit. Lassen Sie es länger als eine Sekunde laufen und Sie sollten sehen, dass sich die Zeit etwas ändert. –

+1

Also gibt es keine Anforderung, wie diese Daten definiert sind, außer dass sie unterschiedlich sind? Daten im Jahr 3000 zu haben wäre okay? Was genau willst du hier erreichen? –

Antwort

1

Wenn die einzige Voraussetzung ist, dass die Daten unterschiedlich sind jeweils aus anders, dann können Sie das Datum manuell um einen beliebigen Betrag in der Schleife erhöhen.

Und falls Sie Java 8 oder höher verwenden, empfehle ich auch, von der alten java.util.Date API Abstand zu halten und stattdessen java.time zu verwenden.

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

Sie können immer noch zurück zu Date-Objekte umwandeln, wenn Sie wirklich brauchen von Date.from(instant) verwenden.

EDIT: Als ich Ihre aktualisierten Anforderungen sah, habe ich meine Antwort jetzt angepasst.

Es gibt einige Einschränkungen, die Sie bewusst sein müssen:

  • Systemuhr Auflösung: Sie werden nicht um manuell bekommen einige Daten fälschen (zum Beispiel durch eine Millisekunde hinzugefügt jede Iteration in die Schleife), da die Auflösung des Systemtakts nicht präzise genug ist, um bei jedem Aufruf einen eindeutigen Zeitstempel zu erzeugen.

  • Datentyp des Spalts in Ihrer Datenbank: Datenbanken oft nur eine begrenzte Genauigkeit für die Datumswerte sie speichern können. Zum Beispiel kann der alte Date-Datentyp von Oracle nur eine Genauigkeit von Sekunden und keine Brüche speichern. Ich glaube, dass MS SQLServer DateTime Typ seine Millisekunden auf das nächste Drittel einer Sekunde oder so ähnlich rundet.

  • Java-Datentyp Präzision: Der alte java.util.Date Typ kann nur speichern Präzision bis Millisekunden. java.time.Instant kann auch Nanosekunden speichern. JDBC in Java 8 wird mit passenden Methoden geliefert, die Instant anstelle von Date akzeptiert, aber die tatsächliche Datenbank und ihre JDBC-Treiberimplementierung müssen diese Genauigkeit natürlich auch unterstützen.

4

beenden muss Dieser Nano gibt mehr Wert als Milli und Sie geben statt Millisekunden einen Nanosekundenwert aus, daher das bizarre Ergebnis.

Was Date(long date) Konstruktor

Datum erwartet - die Millisekunden seit dem 1. Januar 1970, 00:00:00 GMT.

Was Nanotime

Rückkehr

Gibt den aktuellen Wert der laufenden Java Virtual Machine hochauflösenden Zeitquelle, in Nanosekunden.

Die nanoTime ist überhaupt nicht auf Date() verwandt. Es ist entworfen und implementiert, um einen anderen Zweck zu lösen.

Diese Methode kann nur die verstrichene Zeit verwendet werden, und ist nicht auf irgendeinem anderen Begriff des Systems oder Wandtaktzeit Bezug zu messen. Der zurückgegebene Wert entspricht Nanosekunden seit einer bestimmten, aber beliebigen Ursprungszeit (möglicherweise in der Zukunft, also können die Werte negativ sein). Derselbe Ursprung wird von allen Aufrufen dieser Methode in einer Instanz einer virtuellen Java-Maschine verwendet. Andere VM-Instanzen verwenden wahrscheinlich einen anderen Ursprung.


hier gebraucht unterschiedliche Werte für Datum in jeder Iteration der for-Schleife zu generieren.

Wahrscheinlich können Sie versuchen, in wenigen Minuten/Tag bis zum aktuellen Datum hinzugefügt Zeit durch Zugabe von i Wert?

2

Das erste Code-Snippet funktioniert wie erwartet. Alle Schritte in der Schleife werden gleichzeitig ausgeführt.Wenn Sie dann verschiedene Zeit wollen sleep der ausführende Thread:

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

die folgenden geben würde:

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 

Der zweite Codeausschnitt ist falsch in Bezug auf das Datum Millis in Konstruktor erwartet. Die nanoTime() sollte tatsächlich verwendet werden, um das Delta zu bekommen, wie

Der zurückgegebene Wert stellt ns seit einer festen aber beliebigen Zeit (vielleicht in der Zukunft, so Werte negativ sein kann).

0

new Date(long time)gives a date based on milliseconds - es ist nicht, dass es das falsche Datum ist zu geben, ist es der richtige Zeitpunkt für die falsche Zeit gegeben

System.currentTimeMillis() die richtige Zeit für Datum gibt, während System.nanoTime() über 1000x die richtige Zeit ist (in Millisekunden)

Es kann einfacher sein new Date() über new Date(System.currentTimeMillis()) zu verwenden, as they will both give the current time to the closest millisecond


Wenn Ihr Ziel ist ähnlich Termine zu bekommen, stattdessen versuchen, die Zeit Erhöhen Sie mit den Daten sind initialisiert (in diesem Fall 1 Sekunde Unterschiede)

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

Das Hauptproblem ist, dass die Ausgabe nur ganze Sekunden anzeigt, nicht Millisekunden. –

+0

@ Code-Apprentice Sind Sie sicher, OP verwendet einen Computer langsam genug, dass eine For-Schleife dauert mehrere Millisekunden? – phflack

Verwandte Themen