如果仅提前或落后 5 分钟,如何四舍五入到最近的小时?

Dev*_*Dev 8 java datetime java-8

我想Instant在 Java 中将一个四舍五入到最接近的小时,但前提是它在最接近的小时的 5 分钟内。

假设时间是:2021-02-08T19:02:49.594
预期结果:2021-02-08T19 :00:00.000

同样,如果时间是:2021-02-08T19:56:49.594
预期结果:2021-02-08T20 :00:00.000

但如果时间是 2021-02-08T19:54:49.594 或 2021-02-08T19:06:49.594 那么什么都不做。

小智 7

另一种选择是使用 Duration 类来获取差异并相应地更改它:

Instant roundToHourIfWithin5Min(Instant instant) {
  final Instant now = Instant.now();
  final Duration absoluteDifference = Duration.between(now, instant).abs();
  // If the difference is less than 5 min then we round off
  if (absoluteDifference.compareTo(Duration.ofMinutes(5)) < 0) {
    final Instant truncated = now.truncatedTo(ChronoUnit.HOURS);
    if (instant.isBefore(now)) {
      return truncated.plus(1, ChronoUnit.HOURS);
    }
    else {
      return truncated;
    }
  }
  return instant;
}
Run Code Online (Sandbox Code Playgroud)


Arv*_*ash 6

您可以简单地检查日期时间的分钟部分,然后根据要求将其截断为小时。

演示:

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);
        int minute = ldt.getMinute();
        return minute < 5 ? ldt.truncatedTo(ChronoUnit.HOURS)
                : (minute >= 55 ? ldt.plusHours(1).truncatedTo(ChronoUnit.HOURS) : ldt);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

2021-02-08T19:00:00.000
2021-02-08T20:00:00.000
2021-02-08T19:54:49.594
2021-02-08T19:06:49.594
Run Code Online (Sandbox Code Playgroud)