2017-01-03 250 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,感谢您一直有见识的输入。我发现以毫秒为单位来读取算术更方便,更容易(当然,您不需要同意)。当然需要一些算术。 –