mar*_*hon 3 java time duration period java-time
我知道这java.time.Period是一个“估计”并且java.time.Duration是准确的。我仍然想将周期转换为持续时间。或者至少声明持续时间为数周或更长时间,而不需要采取任何手段。
即使这可以编译,它也会抛出运行时异常,因为ChronoUnit.WEEKS和更大的返回 trueChronoUnit.isDurationEstimated()
var d = Duration.of(2, ChronoUnit.WEEKS);
Run Code Online (Sandbox Code Playgroud)
同样,它可以编译,但会因为同样的原因抛出:
var d = Duration.from(Period.ofWeeks(2));
Run Code Online (Sandbox Code Playgroud)
从 ISO-8601 字符串进行往返是可行的,但味道不太对:
var p = Period.ofWeeks(2);
var d = Duration.parse(p.toString());
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
Ajava.time.Period是年、月、日的一段时间。Ajava.time.Duration是小时、分钟、秒和秒的一小部分的持续时间。它们不兼容,一般来说,将一种转换为另一种是没有意义的。
我假设您仍然有尝试这样做的实际目的。其他人已经提到,您需要决定一年和一个月的长度,因为它们并不总是具有相同的长度。对于几天来说也是如此:一天的长度也总是相同。诚然,通常是 24 小时,但也可能是 23 或 25 小时或其他长度。
\n顺便说一句,另一个区别是,Period将各个字段保留数年、数月和数天。您可以拥有Period2 年 28 个月零 3 天。ADuration不保留单独的字段,并且始终将 60 秒转换为一分钟,将 60 分钟转换为一小时。
APeriod接受周数,但将一周转换为 7 天。ADuration类似地接受天数并将一天转换为 24 小时,而不考虑我刚才所说的事实,一天并不总是 24 小时。
所有这些都意味着您可以将 aPeriod的天和/或周转换为 a Duration,例如,如果您接受一天为 24 小时的假设,则可以使用字符串方法。Period如果其中包含任何年份或月份,您的方法将失败,但有例外。
java.time 包括年和月的估计持续时间。这些可能适合也可能不适合您的目的。只有你可以决定。我可以向您展示如何使用它们。
\npublic static Duration ofPeriod(Period period) {\n    Duration years = ChronoUnit.YEARS.getDuration().multipliedBy(period.getYears());\n    Duration months = ChronoUnit.MONTHS.getDuration().multipliedBy(period.getMonths());\n    Duration days = ChronoUnit.DAYS.getDuration().multipliedBy(period.getDays());\n    return years.plus(months).plus(days);\n}\nRun Code Online (Sandbox Code Playgroud)\n在 2 周的示例中,问题给出的结果与其他答案中的结果相同:
\n\n\nPT336H
\n
月份和年份的处理方式不同。让\xe2\x80\x99s 尝试 1 年 1 个月:
\n    Period period = Period.of(1, 1, 0);\n    Duration duration = ofPeriod(period);\n    System.out.println(duration);\nRun Code Online (Sandbox Code Playgroud)\n\n\nPT9496H18M18S
\n
所以 9496 小时 18 分 18 秒。
\nPeriodDurationThreeTen Extra 项目与 java.time 一起开发,包括一个PeriodDuration持续时间为年、月、日、小时、分钟、秒和几分之一秒的类。顾名思义,aPeriod和 a的组合Duration的组合。您可以看看这是否适合您的目的。
链接:
\nPeriodDuration没有直接的方法可以将 转换为 ,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);
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
Period period = Period.ofWeeks(2);
Duration duration = ofPeriod(period);
System.out.println(duration);
Run Code Online (Sandbox Code Playgroud)
输出:
PT336H
Run Code Online (Sandbox Code Playgroud)