2017-01-03 198 views
4

我想根據當前時間獲取15分鐘的時間範圍。根據當前時間獲取具體的15分鐘時間範圍

例如:

時限爲every 15 minutes

即12〜1分爲四個時限[ 12:00 to 12:15, 12:16 to 12:30, 1:31 to 12:45, 12:46 to 1:00]

如果當前時間是12:34手段,我需要返回的期限爲12:31 to 12:45

有什麼事情,我們可以使用Java 8日期很容易做的,時間API?

+1

好笑,這個[問題](http://stackoverflow.com/q/41438768/4391450)最近很接近。家庭作業 ? – AxelH

回答

5

您可以創建一個TemporalAdjuster,計算當前15分鐘時間段的結束時間,並通過刪除14分鐘來計算時間段的開始時間。

看起來是這樣的:

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

其輸出12:31 - 12-45

注意:我不確定它是如何在DST更改周圍發生的 - 要進行測試。

+0

感謝您的回答。 – Shankar

+1

或者只是'int minutesDiff = 15分鐘%15;'...... – Holger

+0

@Holger實際上既不會保留秒/納秒。首先編輯重置爲午夜。 – assylias

3

您可以簡單地使用Date API並計算間隔。 用你的間隔(15分鐘)分開再乘。這將刪除分鐘和四分鐘到較低的15分鐘間隔。現在你必須增加十五分鐘來獲得你需要的輸出。請看下面的代碼:

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

running example

編輯:

Running example與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

提問者詢問Java 8日期和時間API。我也認爲最好使用這個而不是java.util.Date和長算術。 –

+0

@ OleV.V。,我同意使用LocalDate,但算術更容易。 (請注意,這可能會更清晰) – AxelH

+0

@AxelH,感謝您一直有見識的輸入。我發現以毫秒爲單位來讀取算術更方便,更容易(當然,您不需要同意)。當然需要一些算術。 –

相關問題