根据当前时间获取特定的15分钟时间范围

时间:2017-01-03 08:40:03

标签: java java-8 java-time

我想根据当前时间获得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 Date and Time API,我们可以轻松完成这项工作吗?

3 个答案:

答案 0 :(得分:5)

您可以创建一个计算当前15分钟结束时间的TemporalAdjuster,并通过删除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更改方面的表现如何 - 需要进行测试。

答案 1 :(得分: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

编辑:

使用LocalDate

Running example

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

答案 2 :(得分:0)

这是一个更简单的 LocalTime 方法

public static void main(String[] args) {
  int interval = 15; //Can be customized to any value
  LocalTime now = LocalTime.now();
  int minuteOfDay = now.toSecondOfDay() / 60;
  int mod = (minuteOfDay / interval + 1) * interval;
  System.out.println("lower bound" + LocalTime.ofSecondOfDay((mod - interval) * 60));
  System.out.println("Upper bound" + LocalTime.ofSecondOfDay(mod * 60));
}