java - 如何将 ZonedDateTime 舍入为持续时间

标签 java rounding duration zoneddatetime

我有一个 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/

相关文章:

php - 从文件解析数据后使用舍入函数

c# - 试图模仿 Excel 舍入让我很伤心

MySQL第1583轮

java 8 持续时间 "ofSeconds"与 "withSeconds"

java - 在 Java 中使用默认构造函数扩展类

java - ApplicationContextAware 与 Setter 注入(inject)

java - 收到致命警报 : handshake_failure through SSLHandshakeException

javascript - 如何找到一组持续时间中的常见重叠?

mysql - 空间索引减慢查询mysql

java - OnstartPage 方法中出现 Stackoverflow 错误