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.time
API不支持四舍五入到天花板上,但是它确实支持舍入到地板(截断),可实现期望的行为(其是不完全四舍五入到天花板):
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
函数来执行舍入.(调节器可以编写一次,测试,并作为静态变量或方法提供).
LocalDateTime newTime = now.plusMinutes(1).minusNanos(1).withSecond(0).withNano(0);
Run Code Online (Sandbox Code Playgroud)
这将四舍五入到最接近的分钟,作为以分钟为整数部分的天花板函数。