2014-08-28 9 views
17

So genug Ich habe Glück zu verwenden Java 8 und die neue Zeit APi, aber ich sehe keine Rundungsfunktionen ...Runde Minuten bis zur Decke mit Java 8

Grundsätzlich, wenn die Zeit ist ...

2014-08-28T10:01.00.000 ----> 2014-08-28T10:02.00.000 
2014-08-28T10:01.10.123 ----> 2014-08-28T10:02.00.000 
2014-08-28T10:01.25.123 ----> 2014-08-28T10:02.00.000 
2014-08-28T10:01.49.123 ----> 2014-08-28T10:02.00.000 
2014-08-28T10:01.59.999 ----> 2014-08-28T10:02.00.000 

Das scheint in Ordnung zu sein, aber ist es richtig?

LocalDateTime now = LocalDateTime.now(Clock.systemUTC()); 
LocalDateTime newTime = now.plusMinutes(1); 

System.out.println(newTime.toString()); 
System.out.println(newTime.format(DateTimeFormatter.ofPattern("yyyy-dd-MM'T'HH:mm:00.000"))); 
+4

Sollte nicht die erste Zeile '10: 01' auf der rechten Seite sein? Eine Deckenfunktion würde den Wert nicht ändern, wenn der Bruchteil 0 ist. –

+0

Ich möchte immer aufrunden :) – user432024

+2

Eine runde Zahl ändert sich nicht, wenn man sie rundet. Was du verlangst, unterscheidet sich geringfügig von einer Deckenfunktion. –

Antwort

30

java.time Die API unterstützt nicht bis zur Decke Abrunden aber es unterstützt rounding to floor (truncation), die das gewünschte Verhalten ermöglicht (die nicht genau bis zur Decke Rundung):

LocalDateTime now = LocalDateTime.now(); 
LocalDateTime roundFloor = now.truncatedTo(ChronoUnit.MINUTES); 
LocalDateTime roundCeiling = now.truncatedTo(ChronoUnit.MINUTES).plusMinutes(1); 

Zusätzlich gibt es eine Einrichtung, um eine Uhr zu erhalten, die einmal pro Minute tickt nur, die von Interesse sein könnte:

Clock minuteTickingClock = Clock.tickMinutes(ZoneId.systemDefault()); 
LocalDateTime now = LocalDateTime.now(minuteTickingClock); 
LocalDateTime roundCeiling = now.plusMinutes(1); 

Diese Uhr wird automatisch Minuten zu Boden gestutzt (obwohl es specified so ist, dass es sich um eine zurückkehren verzögerter Cache-Wert). Beachten Sie, dass eine Clock in einer statischen Variablen gespeichert werden kann, falls gewünscht.

Wenn es sich schließlich um eine allgemeine Operation handelt, die Sie an mehreren Stellen verwenden möchten, können Sie eine Bibliotheksfunktion schreiben, um die Rundung durchzuführen. (Justierer können einmal geschrieben, getestet und als statische Variable oder Methode zur Verfügung gestellt werden).

+0

Danke, dass ich brauche. Ich weiß, dass meine Rundung ein bisschen komisch ist, aber im Grunde muss ich mein DB-System basierend auf der aktuellen Zeit abfragen.Wenn ich mehrere Benutzer innerhalb der aktuellen Minute eine Abfrage mit der Aufrundung mache, kann ich den Filter zwischenspeichern! :) – user432024

+0

Dieser Algorithmus wäre für genaue Minuten falsch. Z.B. Nehmen wir an, die aktuelle Zeit beträgt genau 5 Minuten (d. h. 0 Sekunden, 0 Nanosekunden usw.). In diesem Fall würde ich roundCeiling 5 Minuten erwarten (d. H. Wie die Obergrenze von "1,00" Dezimalzahl ist "1") - aber der Algorithmus würde 6 Minuten geben. roundCeiling-Berechnung oben sollte überprüfen, ob der abgeschnittene Wert derselbe wie 'jetzt' ist - in diesem Fall gib 'jetzt' zurück, ansonsten die +1 Minuten. –

+1

Obwohl ich jetzt bemerkt habe, dass die ursprüngliche Frage immer aufruft (auch wenn die Nummer bereits rund ist), so ist die akzeptierte Antwort in diesem Fall korrekt. –

1

java.time (die neue Zeit-API in Java 8) keine Rundung verfügt wie einige andere Bibliotheken. Sie versuchen, Formatierung zu verwenden, um auf Zeichenfolgenebene zu runden. Wenn Sie die Zeit Objekte jedoch runden möchten, dann können Sie dies manuell tun Runden:

LocalDateTime now = LocalDateTime.now(Clock.systemUTC()); 
LocalDateTime newTime = now.plusMinutes(1).withSecond(0).withNano(0); 

By the way, Sie sicherlich Boden gemeint, nicht Decke, ist es nicht?

Update:

ich diese etwas besser Weg gefunden haben, zu Boden Einstellung (offensichtlich die einzige Rundung Funktion Decke wird nicht unterstützt):

LocalDateTime now = LocalDateTime.now(Clock.systemUTC()); 
LocalDateTime newTime = now.plusMinutes(1).truncatedTo(ChronoUnit.MINUTES); 
+0

Ich meine Decke, gut, ich möchte aufrunden, egal ob es 10 Sekunden, 25 Sekunden oder 49 Sekunden ist. – user432024

2
LocalDateTime newTime = now.plusMinutes(1).minusNanos(1).withSecond(0).withNano(0); 

Dies wird aufrunden auf die nächste Minute, fungiert als eine Deckenfunktion mit Minuten als ganzzahliger Teil.

+0

Wo ist die Vereinfachung? Das Schreiben komplexer 'TemporalAdjuster'-Implementierungen sollte in den meisten Fällen auf Frameworks oder Library-Writer beschränkt sein, nicht auf Endbenutzer. Hier liegt die Last, den Adjuster-Code zu schreiben, immer noch beim Benutzer. Nur meine 2 Cent ... –

+0

@Meno Hochschild: Du hast Recht, ich graben durch java.time für relevante Funktionalität und in der Bibliothek Schreibmodus aufgewickelt. Definitiv übertrieben für dieses Problem. –