java - 有没有一种直接的方法可以将 java.time.Period 转换为 java.time.Duration?

标签 java time java-time duration period

我了解 java.time.Period 是“估计”,而 java.time.Duration 是准确的。我仍然想将期间转换为持续时间。或者至少在不诉诸诡计的情况下宣布持续数周或更长时间。

即使这样编译,它也会抛出运行时异常,因为 ChronoUnit.WEEKS 和更大的返回 true 为 ChronoUnit.isDurationEstimated()

var d = Duration.of(2, ChronoUnit.WEEKS);

同样,这会编译但出于同样的原因抛出:

var d = Duration.from(Period.ofWeeks(2));

从 ISO-8601 字符串进行往返是可行的,但味道不对:

var p = Period.ofWeeks(2);
var d = Duration.parse(p.toString());

有没有更好的方法来做到这一点?

最佳答案

没有直接的方法可以将 Period 转换为 Duration,因为您必须将年或月转换为天、分、秒、毫秒或毫微秒。但是,1 年等于 365 天还是 366 天(闰年)?还是 1 个月等于 28、29、30 或 31 天?

但是,您可以进行估算。例如:

public static Duration ofPeriod(Period period) {

    long days = period.getDays() + Math.round((period.toTotalMonths() / 12d) * 365.2425d);

    return Duration.ofDays(days);
}

那么你可以这样做:

Period period = Period.ofWeeks(2);

Duration duration = ofPeriod(period);

System.out.println(duration);

输出:

PT336H

关于java - 有没有一种直接的方法可以将 java.time.Period 转换为 java.time.Duration?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69247292/

相关文章:

java - XPath:如何使用第二个子节点的值选择子节点

php - 如何合并/聚合带有时间戳的数组作为这些列之一

java - 为什么 Instant.now() 有时格式不同?

java - ZonedDateTime 现在函数强制包含第二个值

java - jsp中的分页

java - 为什么 MenuItemCompat.getActionProvider 返回 null?

java - Java 中的线程安全

go - time.After 在指定时间后没有被触发

time - 如何在Lua 5.1中使os.time()在32位机器上兼容?

java - 解析带有闰秒的持续时间,如 00 :00:60