问题
java.time.Period 表示年、月和日的时间段。 java.time.Duration 是小时、分钟、秒和几分之一秒的持续时间。它们不兼容,一般来说,将一个转换为另一个是没有意义的。
我假设您仍然有尝试这样做的实际目的。其他人已经提到,您需要决定考虑一年和一个月的时间,因为它们的长度并不总是相同。几天也是如此:一天的长度也不总是相同的。诚然,它通常是 24 小时,但也可能是 23 或 25 小时或其他长度。
顺便说一句,另一个区别是Period 将各个字段保留数年、数月和数天。您可以拥有 2 年 28 个月零 -3 天的 Period。 Duration 不保留单独的字段,并且始终将 60 秒转换为一分钟,将 60 分钟转换为一小时。
Period 接受周数,但将一周转换为 7 天。 Duration 类似地接受天数并将一天转换为 24 小时,而不考虑我刚才所说的事实,一天并不总是 24 小时。
所有这一切都意味着如果您接受一天是 24 小时的假设,您可以将几天和/或几周的 Period 转换为 Duration,例如使用您的字符串方法。如果 Period 包含任何年份或月份,您的方法将失败并出现异常。
没有四舍五入的解决方案
java.time 包括估计的年和月持续时间。这些可能适合也可能不适合您的目的。只有你可以决定。我可以告诉你如何使用它们。
public static Duration ofPeriod(Period period) {
Duration years = ChronoUnit.YEARS.getDuration().multipliedBy(period.getYears());
Duration months = ChronoUnit.MONTHS.getDuration().multipliedBy(period.getMonths());
Duration days = ChronoUnit.DAYS.getDuration().multipliedBy(period.getDays());
return years.plus(months).plus(days);
}
在 2 周示例中,问题给出的结果与其他答案相同:
PT336H
月份和年份的处理方式不同。让我们试试 1 年 1 个月的时间段:
Period period = Period.of(1, 1, 0);
Duration duration = ofPeriod(period);
System.out.println(duration);
PT9496H18M18S
所以 9496 小时 18 分 18 秒。
三个额外的PeriodDuration
ThreeTen Extra 项目与 java.time 一起开发,包括一个 PeriodDuration 类,用于年、月、日、小时、分钟、秒和秒的小数部分。顾名思义,Period 和 Duration 的组合。您可以看看这是否适合您的目的。
链接: