我需要一个表示年,月,周,日,小时,分钟,秒的间隔数据类型.前三个(年,月,日)可以完成,Period最后三个(小时,分钟,秒)可以完成,Duration但是它们似乎都没有.理想情况下,我希望避免实现自定义TemporalAmount.
没有这种类型是有原因的。没有明确定义的时间间隔,例如“日”、“月”或“年”:
即使您实现了自定义 TemporalAmount,在某些情况下,您的代码也很可能不正确。如果您陈述您的实际要求,您可能会得到更好的答案。
之所以没有这样的类,是因为时间跨度实际上是两个不同的概念。在 Java 中,这两个概念在两个不同的类中实现:
虽然持续时间始终具有相同的时间长度,但期间的实际时间长度取决于其应用的时间和地点。一个月的期限可以是 28、29、30 或 31 天 - 实际持续时间取决于具体情况。当给定时区实行夏令时时,一天的时间可能有 23、24 或 25 小时(甚至更多)。
以下是影响周期到持续时间转换的因素的一小部分且可能不完整的列表。
这就是为什么Period单独存储天、月和年,而Duration只存储秒(和纳秒)。它们确实共享相同的时间单位DAY,但Duration一天被视为 24 小时,并直接转换为 86,400 秒。
所以你需要定义你的应用程序。您想要一个持续时间(固定的秒数)还是一个周期(一年一次、每月两次、每天凌晨 2:00 发生的事情)?
以下是他们如何在夏令时更改后计算不同时刻的示例:
Duration oneDayDuration = Duration.ofDays(1);
Period oneDayPeriod = Period.ofDays(1);
ZonedDateTime beforeChange = Instant.parse("2015-10-25T00:00:00.00Z").atZone(ZoneId.of("Europe/Berlin"));
System.out.println(beforeChange);
System.out.println(oneDayDuration.addTo(beforeChange));
System.out.println(oneDayPeriod.addTo(beforeChange));
Run Code Online (Sandbox Code Playgroud)
将打印
2015-10-25T02:00+02:00[Europe/Berlin]
2015-10-26T01:00+01:00[Europe/Berlin]
2015-10-26T02:00+01:00[Europe/Berlin]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2327 次 |
| 最近记录: |