使用Java 8在几分钟内完成

use*_*024 32 datetime rounding ceil java-8 java-time

所以我很幸运能够使用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
Run Code Online (Sandbox Code Playgroud)

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

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")));
Run Code Online (Sandbox Code Playgroud)

Jod*_*hen 53

java.timeAPI不支持四舍五入到天花板上,但是它确实支持舍入到地板(截断),可实现期望的行为(其是不完全四舍五入到天花板):

LocalDateTime now =  LocalDateTime.now();
LocalDateTime roundFloor =  now.truncatedTo(ChronoUnit.MINUTES);
LocalDateTime roundCeiling =  now.truncatedTo(ChronoUnit.MINUTES).plusMinutes(1);
Run Code Online (Sandbox Code Playgroud)

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

Clock minuteTickingClock = Clock.tickMinutes(ZoneId.systemDefault());
LocalDateTime now =  LocalDateTime.now(minuteTickingClock);
LocalDateTime roundCeiling =  now.plusMinutes(1);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 精确分钟时间此算法不正确.例如,假设当前时间恰好是5分钟(即0秒,0纳米等).在那种情况下,我希望roundCeiling为5分钟(即像"1.00"十进制数的上限是"1") - 但算法将给出6分钟.上面的roundCeiling计算应检查截断值是否与'now'相同 - 在这种情况下返回'now',否则返回+1分钟. (5认同)

Sea*_*der 5

LocalDateTime newTime = now.plusMinutes(1).minusNanos(1).withSecond(0).withNano(0);
Run Code Online (Sandbox Code Playgroud)

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