Datetime 使用Java8将分钟缩短到上限

Datetime 使用Java8将分钟缩短到上限,datetime,java-8,rounding,java-time,ceil,Datetime,Java 8,Rounding,Java Time,Ceil,所以我很幸运地使用了Java8和新的TimeAPI,但是我没有看到任何舍入函数 基本上如果时间是 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 ----&g

所以我很幸运地使用了Java8和新的TimeAPI,但是我没有看到任何舍入函数

基本上如果时间是

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")));
java.time
(Java8中的新时间API)与其他一些库一样,具有无舍入特性。您尝试使用格式在字符串级别上取整。但是,如果要对时间对象进行舍入,则可以手动执行此舍入操作:

LocalDateTime now =  LocalDateTime.now(Clock.systemUTC());
LocalDateTime newTime =  now.plusMinutes(1).withSecond(0).withNano(0);
顺便说一下,你的意思肯定是地板,不是天花板,对吗

更新:

我发现这是一种稍微好一点的设置地板的方法(显然是唯一的圆角功能,不支持天花板):


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

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

此外,还提供了一种设备,用于获取每分钟仅滴答一次的时钟,这可能会引起人们的兴趣:

Clock minuteTickingClock = Clock.tickMinutes(ZoneId.systemDefault());
LocalDateTime now =  LocalDateTime.now(minuteTickingClock);
LocalDateTime roundCeiling =  now.plusMinutes(1);
此时钟将自动将分钟数截断到楼层(尽管它可能返回延迟的缓存值)。请注意,如果需要,
时钟
可以存储在静态变量中


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

第一行不应该是右侧的
10:01
?如果小数部分为0,则上限函数不会更改值。我始终希望将其四舍五入:)如果将其四舍五入,则舍入数不会更改。你所要求的与天花板功能略有不同。简化在哪里?编写复杂的
TemporalAdjuster
——在大多数情况下,实现应限于框架或库编写器,而不是最终用户。在这里,编写调整器代码的负担仍然由用户承担。就我的2美分…@Meno Hochschild:你说得对,我在java.time中挖掘相关功能,最终进入了库编写模式。对于这个问题,我的意思是说上限,我想把它凑起来,不管是10秒,25秒还是49秒。谢谢,这是我需要的。我知道我的取整有点奇怪,但基本上我需要根据当前时间查询我的数据库系统。如果我有多个用户在当前分钟内使用取整进行查询,我可以缓存筛选器!:)此算法对于精确的分钟时间是不正确的。例如,假设当前时间正好为5分钟(即0秒、0纳秒等)。在这种情况下,我希望Round天花为5分钟(即“1.00”的小数上限为“1”)——但算法会给出6分钟。上面的round天花板计算应检查截断值是否与“now”相同-在这种情况下返回“now”,否则返回+1分钟。虽然现在我注意到原始问题要求始终向上取整(即使数字已经是四舍五入),因此在这种情况下,接受的答案是正确的。
LocalDateTime newTime = now.plusMinutes(1).minusNanos(1).withSecond(0).withNano(0);
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);