43

所以我很幸运能够使用 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")));
4

3 回答 3

68

java.timeAPI 不支持四舍五入到天花板,但它支持四舍五入到地板(截断),这可以实现所需的行为(这不完全是四舍五入到天花板):

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);

此时钟将自动将分钟截断到下限(尽管它被指定为可能返回延迟的缓存值)。请注意,Clock如果需要,可以将 a 存储在静态变量中。

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

于 2014-08-28T21:49:43.977 回答
5
LocalDateTime newTime = now.plusMinutes(1).minusNanos(1).withSecond(0).withNano(0);

这将四舍五入到最接近的分钟,充当以分钟为整数部分的天花板函数。

于 2014-08-28T16:32:23.493 回答
1

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);
于 2014-08-28T16:01:00.050 回答