使用Java 8在几分钟内完成

时间:2014-08-28 14:58:57

标签: datetime java-8 rounding java-time ceiling

所以我很幸运能够使用Java 8和新的时间APi,但我没有看到任何舍入函数......

基本上如果时间是......

2014-08-28T10:01.00.000 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.10.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.25.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.49.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.59.999 ----> 2014-08-28T10:02.00.000

这似乎没问题,但是不是吗?

LocalDateTime now =  LocalDateTime.now(Clock.systemUTC());
LocalDateTime newTime =  now.plusMinutes(1);

System.out.println(newTime.toString());
System.out.println(newTime.format(DateTimeFormatter.ofPattern("yyyy-dd-MM'T'HH:mm:00.000")));

3 个答案:

答案 0 :(得分:48)

java.time API不支持向上舍入,但它支持rounding to floor(截断),这可以实现所需的行为(不是完全向上舍入):

LocalDateTime now =  LocalDateTime.now();
LocalDateTime roundFloor =  now.truncatedTo(ChronoUnit.MINUTES);
LocalDateTime roundCeiling =  now.truncatedTo(ChronoUnit.MINUTES).plusMinutes(1);

此外,还有一种设施可以获得每分钟只能打一次的时钟,这可能是有意义的:

Clock minuteTickingClock = Clock.tickMinutes(ZoneId.systemDefault());
LocalDateTime now =  LocalDateTime.now(minuteTickingClock);
LocalDateTime roundCeiling =  now.plusMinutes(1);

此时钟将自动截断分钟到楼层(尽管它是specified,因此它可能会返回延迟的缓存值)。请注意,如果需要,Clock可以存储在静态变量中。

最后,如果这是您想要在多个位置使用的常见操作,则可以编写库TemporalAdjuster函数来执行舍入。 (调整器可以编写一次,测试,并作为静态变量或方法提供。)

答案 1 :(得分:2)

LocalDateTime newTime = now.plusMinutes(1).minusNanos(1).withSecond(0).withNano(0);

这将向上舍入到最近的分钟,作为上限函数,以分钟为整数部分。

答案 2 :(得分:1)

java.time(Java 8中的新时间API)与其他一些库一样具有无舍入功能。您尝试使用格式在String级别上舍入。但是,如果要对时间对象进行舍入,则可以手动舍入:

LocalDateTime now =  LocalDateTime.now(Clock.systemUTC());
LocalDateTime newTime =  now.plusMinutes(1).withSecond(0).withNano(0);

顺便说一下,你肯定是指地板,而不是天花板,不是吗?

<强>更新

我发现这种设置为楼层的方法稍微好一点(显然唯一的舍入功能,不支持天花板):

LocalDateTime now =  LocalDateTime.now(Clock.systemUTC());
LocalDateTime newTime =  now.plusMinutes(1).truncatedTo(ChronoUnit.MINUTES);