使用 Java 8 达到上限的整数分钟

问题描述 投票:0回答:3

所以我很幸运能够使用 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")));
datetime java-8 rounding java-time ceil
3个回答
74
投票

java.time
API 不支持四舍五入到上限,但它确实支持四舍五入到下限(截断),从而实现所需的行为(不完全四舍五入到上限):

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
函数来执行舍入。 (调整器可以编写一次、测试并作为静态变量或方法提供)。


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

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


2
投票

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

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);
© www.soinside.com 2019 - 2024. All rights reserved.