2017-01-03 4 views
4

Ich möchte den 15-Minuten-Zeitrahmen basierend auf Aktuelle Zeit erhalten.Erhalte den spezifischen 15-Minuten-Zeitrahmen basierend auf der aktuellen Zeit

Zum Beispiel:

Zeitrahmen ist für every 15 minutes.

dh 12-1 gliedert sich in vier Zeitrahmen [ 12:00 to 12:15, 12:16 to 12:30, 1:31 to 12:45, 12:46 to 1:00]

Wenn die aktuelle Zeit 12:34 Mittel ist, ich brauche den zeitlichen Rahmen als 12:31 to 12:45

zurückzukehren Ist es etwas, was wir können mit Java 8 Datum leicht tun und Zeit API?

+1

Das lustig, diese [Frage] (http://stackoverflow.com/q/41438768/4391450) ist neu und ziemlich nah. Hausaufgaben ? – AxelH

Antwort

5

Sie könnten eine TemporalAdjuster erstellen, die das Ende des aktuellen 15-Minuten-Zeitraums berechnet und den Beginn des Zeitraums berechnet, indem Sie 14 Minuten entfernen.

könnte wie folgt aussehen:

public static void main(String[] args) { 
    LocalTime t = LocalTime.of(12, 34); 
    LocalTime next15 = t.with(next15Minute()); 
    System.out.println(next15.minusMinutes(14) + " - " + next15); 
} 

public static TemporalAdjuster next15Minute() { 
    return (temporal) -> { 
    int minute = temporal.get(ChronoField.MINUTE_OF_DAY); 
    int next15 = (minute/15 + 1) * 15; 
    return temporal.with(ChronoField.NANO_OF_DAY, 0).plus(next15, ChronoUnit.MINUTES); 
    }; 
} 

die 12:31 - 12-45 ausgibt.

Hinweis: Ich bin mir nicht sicher, wie es sich um DST-Änderungen verhält - um getestet zu werden.

+0

Danke für die Antwort. – Shankar

+1

Oder einfach 'int MinutenDiff = 15 - Minute% 15;' ... – Holger

+0

@Holger eigentlich auch nicht so wie es die Sekunden/Nanos behalten würde. Bearbeitet, um zuerst auf Mitternacht zurückgesetzt zu werden. – assylias

3

Sie können einfach die Date-API verwenden und die Intervalle berechnen. Teilen Sie sich mit Ihrem Intervall (15 min) und multiplizieren Sie es erneut. Dies wird die Minuten abziehen und auf das untere 15-Minuten-Intervall runden. Jetzt müssen Sie fünfzehn Minuten hinzufügen, um die benötigte Ausgabe zu erhalten. Siehe den folgenden Code:

import java.util.*; 
import java.lang.*; 
import java.io.*; 

class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     long ms = new Date().getTime(); 
     System.out.println("Current time: " + new Date().toString()); 

     long fifteen = 15 * 60 * 1000; 
     long newMs = (ms/fifteen) * fifteen + fifteen; 
     System.out.println("Calculated time: " + new Date(newMs)); 
    } 
} 

Siehe running example

EDIT:

Running example mit LOCALDATE

import java.util.*; 
import java.lang.*; 
import java.io.*; 
import java.time.*; 
import java.time.temporal.ChronoField; 
import java.time.temporal.ChronoUnit; 

class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     LocalTime now = LocalTime.now(); 
     System.out.println(now); 

     LocalTime next = now.with((temp) -> { 
      int currentMinute = temp.get(ChronoField.MINUTE_OF_DAY); 
      int interval = (currentMinute/15) * 15 + 15; 
      temp = temp.with(ChronoField.SECOND_OF_MINUTE, 0); 
      temp = temp.with(ChronoField.MILLI_OF_SECOND, 0); 
      return temp.with(ChronoField.MINUTE_OF_DAY, interval); 
     }); 
     System.out.println(next); 
    } 
} 
+1

Der Fragesteller fragte nach der Java 8 Date and Time API. Ich denke auch, dass es vorzuziehen ist, dies anstelle von 'java.util.Date' und langer Arithmetik zu verwenden. –

+0

@ OleV.V., Ich stimme zu LocalDate zu verwenden, aber Arithmetik ist noch einfacher. (Beachten Sie, dass dies klarer sein könnte) – AxelH

+0

@AxelH, danke für Ihre immer sachkundige Eingabe. Ich finde es bequemer und einfacher zu lesen, um die Arithmetik in Minuten als in Millisekunden auszuführen (Sie müssen natürlich nicht zustimmen). Sicherlich wird etwas Arithmetik benötigt. –

Verwandte Themen