2017-04-24 5 views
1

Ich habe einen Code, der im Grunde Daten protokolliert, wie jetzt scheint alles in Ordnung zu arbeiten, außer ich Probleme habe, den Unterschied zwischen zwei Zeitmarken bekommen:Erhalten Teil Sekunden Differenz von Zeitstempel

System.out.println(readings.size()); 
    displayLog.appendText("Getting ready to print! Beep Boop! \n"); 

      for (int t = 0; t < readings.size(); t++) 
    { 
     displayLog.appendText("Time: " + readings.get(t).getTimestamp() + " CH1: " + readings.get(t).getValue(0) + " CH2: " + readings.get(t).getValue(1) + " CH3: " + readings.get(t).getValue(2) + " CH4: " + readings.get(t).getValue(3) + " CH5: " + readings.get(t).getValue(4) + " CH6: " + readings.get(t).getValue(5) + " CH7: " + readings.get(t).getValue(6) + " CH8: " + readings.get(t).getValue(7) + " CH9: " + readings.get(t).getValue(8) + "\n"); 
    } 
      int maxReading = readings.size() - 1; 
      displayLog.appendText(readings.get(0).getTimestamp() + "\n"); 
      displayLog.appendText(readings.get(maxReading).getTimestamp() + "\n"); 

      Duration timeDifference = Duration.between(readings.get(0).getTimestamp(), readings.get(maxReading).getTimestamp()); 

      displayLog.appendText("Time difference is: " + timeDifference.getSeconds() + "\n"); 

Immer, wenn ich laufe der code bekomme ich einen interger, gibt es einen weg wie ein doppelter mit teilweisen sekunden angezeigt zu bekommen? Sagen 6,3 Sekunden oder 8,8 Sekunden statt 6 und 9. Ich weiß nicht einmal, ob es rundet oder rundet oder schneidet oder was tut es, wenn es diesen Wert zurückgibt? Oder gibt es einen besseren Weg Zeitunterschied zu bekommen?

Die Zeitstempel geloggt durch einen Knopf mit timestamp LocalDateTime.now drücken()

ich diesen Code versucht, zu drucken und sehen, aber ich inconsisten Ergebnisse erhalten:

int maxReading = readings.size() - 1; 
    Duration timeDifference = Duration.between(readings.get(0).getTimestamp(), readings.get(maxReading).getTimestamp()); 
    double secondsDifference = timeDifference.getNano()/1000000000; 
    textLog.appendText("Total time logged is: " + secondsDifference + "\n"); 
    System.out.println(timeDifference.getSeconds() + " | " + secondsDifference + " | " + timeDifference.getNano()); 
    System.out.println("Time logged: " + secondsDifference); 

jedoch ergibt dies aus der folgende Ausgabe, der Sinn (IMO) nicht machen:

4 | 0.0 | 270000000 
Time logged: 0.0 

Wie dies nach es für 4 Sekunden angemeldet? oder für 270000000 Nanosekunden? oder ist es tatsächlich 4,27 Sekunden?

Antwort

1

Ich würde empfehlen, Instant.now() zu verwenden, falls Sie Dinge protokollieren, während eine DST-Änderung angewendet wird, oder Ihr Computer die Zeitzone aus irgendeinem Grund ändert.

Um eine „Dezimal“ Anzahl von Sekunden zu erhalten, können Sie verwenden:

Duration d = ...; 
double seconds = d.toNanos()/1e9d; 

Sie dann das Ergebnis als String, mit der erforderlichen Anzahl von Dezimalstellen anhängen können - sagen Sie 2 Dezimalstellen wollen:

String twoDecimals = String.format("%.2f", seconds); 
+0

was bringt toNanos() zurück? Ich nehme an, dass die Gesamtdauer 6,4 Sekunden beträgt, bekomme ich 6400000000? und Wenn ich das für andere Berechnungen verwenden möchte? Tue ich es dann zu verdoppeln? Ist das nicht ineffizient? (zu string dann zu double) –

+0

Ja, 6,4 Sekunden, in Nanosekunden. Wenn Sie es für andere Berechnungen verwenden, verwenden Sie das Double, nicht die Zeichenfolge. Ich habe gerade von Ihrem Codebeispiel angefangen. – assylias

+0

Beachten Sie, dass getSeconds den "Sekunden" -Teil der Dauer zurückgibt, d. H., Es ist abgeschnitten. – assylias

Verwandte Themen