如何将 Time4J 持续时间转换为分钟数?

How to convert a Time4J Duration to a count of minutes?

如何将 Time4J Duration<ClockUnit> 转换为分钟数?我可以截断任何秒,我只想要整分钟。几个简单的例子可能解释得最好:

没有任何 toMinutes 方法(就像 java.time.Duration 中有)。我尝试了 NormalizergetTotalLength 方法和流操作,得到了一个 6 行解决方案,但肯定有更简单的方法吗?

小时和秒的解决方案也可能很有趣,但我希望它们或多或少是对几分钟解决方案的微不足道的修改。

Link: Documentation of net.time4j.Duration

标准化为分钟并使用 getPartialAmount()

我们确实需要标准化器。我们从 ClockUnit.only() 得到它。然后 getPartialAmount() 处理剩下的事情。

    List<Duration<ClockUnit>> durations = Arrays.asList(
            Duration.of(1, ClockUnit.HOURS),
            Duration.of(34, ClockUnit.SECONDS));
    
    for (Duration<ClockUnit> dur : durations) {
        long minutes = dur.with(ClockUnit.MINUTES.only())
                .getPartialAmount(ClockUnit.MINUTES);
        System.out.format("%s = %d minutes%n", dur, minutes);
    }

输出:

PT1H = 60 minutes
PT34S = 0 minutes

如教程中所述(link 在底部),Time4J 主要围绕时间元素(或字段)设计,例如年、月,是的,分钟。所以在代码中我们首先需要将持续时间转换为只有分钟的持续时间,之后我们可以取出分钟元素的值——现在是持续时间中唯一的元素(在 14 秒的情况下,甚至没有任何分钟元素,但 getPartialAmount() 明智地 returns 0 在这种情况下)。

我们显然应该将转换包装到一个方法中:

private static final long durationToNumber(Duration<ClockUnit> dur, ClockUnit unit) {
    return dur.with(unit.only()).getPartialAmount(unit);
}

作为奖励,此方法使我们可以免费转换为小时或秒:

    for (Duration<ClockUnit> dur : durations) {
        long hours = durationToNumber(dur, ClockUnit.HOURS);
        long seconds = durationToNumber(dur, ClockUnit.SECONDS);
        System.out.format("%s = %d hours or %d seconds%n", dur, hours, seconds);
    }
PT1H = 1 hours or 3600 seconds
PT34S = 0 hours or 34 seconds

Link

Time4J Tutorial: Element centric approach