如何将ZonedDateTime舍入到持续时间

时间:2018-02-24 08:48:35

标签: java rounding duration zoneddatetime

我有一个ZonedDateTime存储在timeStamp变量中。

我的持续时间barDuration可以是1分钟,5分钟,15分钟,1小时,6小时或一天。

我正在绘制宽度为barDuration的蜡烛图。

如果酒吧持续时间设置为1分钟,我需要在一分钟(例如9:43:00)开始这些酒吧。

如果设置为5分钟,我需要在9:45,9:50,9:55等处开始。

如果设置为15分钟,那么条形码从9:45,10:00,10:15等开始。

barDuration为1分钟时,我知道我可以使用以下方式计算条形码的结束时间:

timeStamp.truncatedTo(ChronoUnit.MINUTES).plus(barDuration)

但这是硬编码的,我想直接使用barDuration来执行截断。怎么办呢?

修改

我找到了here Clock s的解决方案:

Clock baseClock = Clock.tickMinutes(timeStamp.getZone());
Clock barClock = Clock.tick(baseClock, barDuration);
LocalDateTime now =  LocalDateTime.now(barClock);
LocalDateTime barEndTime =  now.plus(barDuration);

这样可行,但不是基于我的timeStamp,而是使用LocalDateTime.now(),这不是我想要的(我不确定我机器上的当地时间是与我从远程服务器检索的时间戳同步。

2 个答案:

答案 0 :(得分:1)

也许更优雅的东西是可能的,但以下似乎工作正常。

请务必查看DST测试,因为可能发现将05:00和07:00作为6小时持续时间的开始令人惊讶。 也许这不是你在这些情况下真正想要的。

import axios from 'axios'

答案 1 :(得分:1)

作为JB Nizets answer这里(EDIT :)的一个简陋的补充,Java 9版本更加时间单位中立。

maven install

我没有彻底测试过,但是我希望它可以用于舍入到例如500纳米。我将自一天开始以来的持续时间与持续时间分为一轮,然后立即乘以,以获得该持续时间的整数。

如果您的持续时间不分为一小时,或者您的一天从一小时以外的其他时间开始(如果发生的话),则可能会产生有趣的结果。