我有一个 ZonedDateTime 存储在 timeStamp
变量中。
我还有一个持续时间 barDuration
,可以是一分钟、5 分钟、15 分钟、一小时、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
的解决方案:
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()
,这不是我想要的(我不是确保我的计算机上的本地时间与我从远程服务器检索的时间戳同步)。
最佳答案
作为JB Nizets answer的简单补充这是(编辑:)Java 9 版本,它与时间单位更加中立。
static ZonedDateTime truncateToDuration(ZonedDateTime zonedDateTime, Duration duration) {
ZonedDateTime startOfDay = zonedDateTime.truncatedTo(ChronoUnit.DAYS);
return startOfDay.plus(duration.multipliedBy(
Duration.between(startOfDay, zonedDateTime).dividedBy(duration)));
}
我还没有彻底测试过,但我希望它也能四舍五入到 500 纳秒。我将自一天开始以来的持续时间除以要舍入的持续时间,然后立即相乘,以获得该持续时间的整数。
如果您的持续时间不分为一小时,或者您的一天不是从一整小时开始的(如果发生这种情况),则可能会出现有趣的结果。
关于java - 如何将 ZonedDateTime 舍入为持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48961029/