Java 如果提前1、2、3、4分钟,如何将其四舍五入到最接近的5分钟间隔?

Java 如果提前1、2、3、4分钟,如何将其四舍五入到最接近的5分钟间隔?,java,java-8,instant,localdatetime,Java,Java 8,Instant,Localdatetime,我想将Instant/LocalDateTime四舍五入到Java中最接近的5分钟间隔 示例:假设时间为: 2021-02-08T19:01:49.594 或 或 或 预期结果: 2021-02-08T19:00:00.000 您可以将其截断为,然后根据要求检查小时分钟数,即如果它不是5的倍数,则在除以5时减去余数。用于返回此LocalDateTime的副本,并更改小时分钟数 import java.time.LocalDateTime; import java.time.format.D

我想将Instant/LocalDateTime四舍五入到Java中最接近的5分钟间隔

示例:假设时间为:

2021-02-08T19:01:49.594 

预期结果:

2021-02-08T19:00:00.000
您可以将其截断为,然后根据要求检查小时分钟数,即如果它不是
5
的倍数,则在除以
5
时减去余数。用于返回此
LocalDateTime
的副本,并更改小时分钟数

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

class Main {
    public static void main(String[] args) {
        // Test
        String[] arr = { "2021-02-08T19:02:49.594", "2021-02-08T19:56:49.594", "2021-02-08T19:54:49.594",
                "2021-02-08T19:06:49.594" };

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS");

        for (String s : arr) {
            System.out.println(roundToNearestHour(s).format(dtf));
        }
    }

    static LocalDateTime roundToNearestHour(String str) {
        LocalDateTime ldt = LocalDateTime.parse(str).truncatedTo(ChronoUnit.MINUTES);
        int minute = ldt.getMinute();
        int remainder = minute % 5;
        if (remainder != 0) {
            ldt = ldt.withMinute(minute - remainder);
        }
        return ldt;
    }
}
输出:

2021-02-08T19:00:00.000
2021-02-08T19:55:00.000
2021-02-08T19:50:00.000
2021-02-08T19:05:00.000

对于一个更通用、可重用的解决方案,实现一个与方法一起使用的自定义。下面是从中复制的实现

然后,只需使用它调用
truncatedTo()
,并使用5分钟的“单位”。它同时适用于
LocalDateTime
Instant

String[]输入={“2021-02-08T19:01:49.594”,“2021-02-08T19:02:49.594”,
“2021-02-08T19:03:49.594”、“2021-02-08T19:04:49.594”,
“2021-02-08T19:26:49.594”、“2021-02-08T19:27:49.594”,
“2021-02-08T19:28:49.594”,“2021-02-08T19:29:49.594”;
for(字符串输入:输入){
LocalDateTime dateTime=LocalDateTime.parse(输入);
Instant Instant=Instant.parse(输入+Z);
System.out.printf(“%s->%s%s->%s%n”,
dateTime,dateTime.truncatedTo(持续时间单位:分钟(5)),
瞬间,瞬间。截断为(持续时间单位:分钟(5));
}
输出

2021-02-08T19:01:49.594->2021-02-08T19:00 2021-02-08T19:01:49.594Z->2021-02-08T19:00:00Z
2021-02-08T19:02:49.594->2021-02-08T19:00 2021-02-08T19:02:49.594Z->2021-02-08T19:00:00Z
2021-02-08T19:03:49.594->2021-02-08T19:00 2021-02-08T19:03:49.594Z->2021-02-08T19:00:00Z
2021-02-08T19:04:49.594->2021-02-08T19:00 2021-02-08T19:04:49.594Z->2021-02-08T19:00:00Z
2021-02-08T19:26:49.594->2021-02-08T19:25 2021-02-08T19:26:49.594Z->2021-02-08T19:25:00Z
2021-02-08T19:27:49.594->2021-02-08T19:25 2021-02-08T19:27:49.594Z->2021-02-08T19:25:00Z
2021-02-08T19:28:49.594->2021-02-08T19:25 2021-02-08T19:28:49.594Z->2021-02-08T19:25:00Z
2021-02-08T19:29:49.594->2021-02-08T19:25 2021-02-08T19:29:49.594Z->2021-02-08T19:25:00Z
作为一般用途,它实际上可以与
即时
本地日期时间
偏移日期时间
分区日期时间
本地时间
,以及
偏移时间
,并且它可以与分为一整天的任何时间段一起使用(例如180秒,或5分钟,或2小时,但不是7分钟)

System.out.println(Instant.now().truncatedTo(DurationUnit.ofHours(2));
System.out.println(LocalDateTime.now().truncatedTo(DurationUnit.ofHours(2));
System.out.println(OffsetDateTime.now().truncatedTo(DurationUnit.of Hours(2));
System.out.println(ZonedDateTime.now().truncatedTo(DurationUnit.of Hours(2));
System.out.println(LocalTime.now().truncatedTo(DurationUnit.ofHours(2));
System.out.println(OffsetTime.now().truncatedTo(DurationUnit.ofHours(2));
输出

2021-02-15T06:00:00Z
2021-02-15T02:00
2021-02-15T02:00-05:00
2021-02-15T02:00-05:00[美国/纽约]
02:00
02:00-05:00
定制临时单元

公共最终类DurationUnit实现临时单元{
私人静态最终整数秒/天=86400;
专用静态最终长纳米/秒=1000纳米/秒;
私有静态最终长纳秒/天=纳秒/秒/天;
私人最终期限;
公共静态持续时间单位(持续时间){返回新的持续时间单位(持续时间);}
公共静态DurationUnit of days(长天数){返回新的DurationUnit(Duration.of days(days));}
公共静态持续时间单位小时(长小时){返回新的持续时间单位(持续时间单位小时(小时));}
公共静态持续时间单位分钟(长分钟){返回新的持续时间单位(持续时间单位分钟(分钟));}
公共静态持续时间单位秒(长秒){返回新的持续时间单位(持续时间秒(秒));}
公共静态持续时间单位(长毫秒){返回新的持续时间单位(持续时间单位(毫秒));}
NONOS的公共静态持续时间单位(长nanos){返回新的持续时间单位(NONOS的持续时间(nanos));}
专用工期单位(工期){
if(duration.isZero()| duration.isNegative())
抛出新的IllegalArgumentException(“持续时间不能为零或负”);
这个。持续时间=持续时间;
}
@凌驾
公共持续时间getDuration(){
返回此值。持续时间;
}
@凌驾
公共布尔值isDurationEstimated(){
返回(this.duration.getSeconds()>=每天秒数);
}
@凌驾
公共布尔值isDateBased(){
返回(this.duration.getNano()==0&&this.duration.getSeconds()%SECONDS\u/天==0);
}
@凌驾
公共布尔基(){
返回(this.duration.getSeconds()
你可以转换成秒,减去5模的值,再转换回日期。Souma-我想你已经从和得到了这个答案。如果你能描述一下你可能还有什么疑问,那会很有帮助。这是一个有点不同的要求。我们把19:01和19:02四舍五入到19:00和19:03,19:04四舍五入到19:05,这里我想把d四舍五入
2021-02-08T19:00:00.000
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

class Main {
    public static void main(String[] args) {
        // Test
        String[] arr = { "2021-02-08T19:02:49.594", "2021-02-08T19:56:49.594", "2021-02-08T19:54:49.594",
                "2021-02-08T19:06:49.594" };

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS");

        for (String s : arr) {
            System.out.println(roundToNearestHour(s).format(dtf));
        }
    }

    static LocalDateTime roundToNearestHour(String str) {
        LocalDateTime ldt = LocalDateTime.parse(str).truncatedTo(ChronoUnit.MINUTES);
        int minute = ldt.getMinute();
        int remainder = minute % 5;
        if (remainder != 0) {
            ldt = ldt.withMinute(minute - remainder);
        }
        return ldt;
    }
}
2021-02-08T19:00:00.000
2021-02-08T19:55:00.000
2021-02-08T19:50:00.000
2021-02-08T19:05:00.000