【问题标题】:Is there a straightforward way to convert java.time.Period into java.time.Duration?有没有一种直接的方法可以将 java.time.Period 转换为 java.time.Duration?
【发布时间】:2021-11-13 17:46:37
【问题描述】:

我知道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());

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

【问题讨论】:

  • 本来打算支持您的问题,但我也不想破坏您声誉评分的完美状态。今天特别是我在 cmets 中的 +1。
  • 太晚了,我搞砸了

标签: java time java-time duration period


【解决方案1】:

问题

java.time.Period 表示年、月和日的时间段。 java.time.Duration 是小时、分钟、秒和几分之一秒的持续时间。它们不兼容,一般来说,将一个转换为另一个是没有意义的。

我假设您仍然有尝试这样做的实际目的。其他人已经提到,您需要决定考虑一年和一个月的时间,因为它们的长度并不总是相同。几天也是如此:一天的长度也不总是相同的。诚然,它通常是 24 小时,但也可能是 23 或 25 小时或其他长度。

顺便说一句,另一个区别是Period 将各个字段保留数年、数月和数天。您可以拥有 2 年 28 个月零 -3 天的 PeriodDuration 不保留单独的字段,并且始终将 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 类,用于年、月、日、小时、分钟、秒和秒的小数部分。顾名思义,PeriodDuration 的组合。您可以看看这是否适合您的目的。

链接:

【讨论】:

    【解决方案2】:

    没有直接的方法可以将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
    

    【讨论】:

      猜你喜欢
      • 2020-01-01
      • 1970-01-01
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多