我想根据当前时间获得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,我们可以轻松完成这项工作吗?
答案 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));
}
}
编辑:
使用LocalDateimport 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));
}