如何在java.time中处理完整周期?org.threeten.extra.PeriodDuration

2022-09-03 05:20:39

java.time 中的 Period 类仅处理面向日期的药水:年、月、日。

时间部分:小时,分钟,秒呢?

我们如何解析和生成ISO 8601中定义的完整周期的字符串表示形式?例如,一天半:.学年为九个月。每年我都会有两周零三天的假期, .客户占用了酒店房间2天17个半小时。PnYnMnDTnHnMnSP1DT12HP9MP17DP2DT17H30M

Joda-Time 中的 Period 类处理整个周期。为什么不在java.time中?还有其他机制吗?


答案 1

在 Java SE 8 中,创建类链接是应用程序的责任,如果需要,则创建类链接。PeriodDuration

请注意,a 包含秒数,而不是单独的秒数、分钟数和小时数。秒数可以超过 24 小时,因此 a 可以表示“一天”。但这是一个固定的24小时工作日。相比之下,“day in”的表示是描述性的,并考虑了 DST。的状态由三个独立的字段组成 - 日,月和年。DurationDurationPeriodPeriod

请记住,“客户占用酒店房间2天17个半小时,P2DT17H30M”可能会因DST转换而变得复杂。使用和单独使用事情很清楚 - 受 DST 转换的影响,而不是。PeriodDurationPeriodDuration

在设计方面,最初的java.time确实包括小时,分钟和秒。但是,这导致需要许多方法和复杂的Javadoc来描述规范化和DST的所有可能性。通过分离概念,每个概念与时间轴的交互更加清晰。请注意,这两个类还与 SQL 设计相关(“年到月”和“日到秒”概念)。Period

目前没有计划为Java SE 9添加一个新类,但是不能完全排除它,因为XML / ISO-8601允许单一的组合表示。


答案 2

org.threeten.extra.PeriodDuration

ThreeTen-Extra 项目提供了一个将 a 和 .简称为周期性调节PeriodDuration

ISO-8601 日历系统中的一个时间量,它结合了一个时间段和一个持续时间。

此类根据期间和持续时间对时间量或量进行建模。期间是基于日期的时间量,由年、月和日组成。持续时间是基于时间的时间量,由秒和纳秒组成。有关更多详细信息,请参阅期间和持续时间类。

一个时间段中的天数考虑了夏令时的变化(23 或 25 小时日)。执行计算时,首先添加期间,然后添加持续时间。

警告:请务必阅读JodaStephen的答案,以了解尝试合并和所涉及的问题。在实践中这样做很少有意义,尽管这与我们的直觉背道而驰。PeriodDuration


推荐