我需要一个表示年、月、周、日、小时、分钟、秒的间隔数据类型。前三个(年、月、日)可以完成,Period
后三个(小时、分钟、秒)可以完成,Duration
但它们似乎都没有。理想情况下,我想避免实现自定义TemporalAmount
.
问问题
4296 次
2 回答
5
没有这种类型是有原因的。没有明确定义的时间间隔,例如“日”、“月”或“年”:
- 一天并不总是 24 小时(取决于 DST、时区和闰秒)
- 每个月都有不同的天数
- 闰年有366天
即使您实现了自定义 TemporalAmount,在某些情况下您的代码也很有可能不正确。如果您陈述您的实际要求,您可能会得到更好的答案。
于 2016-01-04T16:22:07.637 回答
2
没有这样的类存在的原因是实际上有两个不同的时间概念:(1)固定的(例如)秒数,在 Java 世界中称为Duration或(2)假设可变的秒数,即称为Period。该时期试图从变化的长度中抽象出来
- 分钟(闰秒,这没有实现)
- 天数(夏令时)
- 月(28、29、30、31 天)
- 年(闰年)
这就是为什么Period
存储日、月、年以及Duration
仅秒和纳秒的原因。是的,它们确实共享相同的时间单位DAY
,但Duration
一天被认为是 24 小时并直接转换为秒。
2016-02-01 和 2016-03-01 之间的期间为 1 个月。持续时间是 696 小时,而不是 720 小时。你可以说一个时期的持续时间可能会改变。
所以你需要定义你的应用程序。你想要一个持续时间(固定的秒数)还是一个周期(一年“发生”一次的事情)?
这是一个示例,他们如何在夏令时更改后计算不同的瞬间:
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));
将打印
2015-10-25T02:00+02:00[Europe/Berlin]
2015-10-26T01:00+01:00[Europe/Berlin]
2015-10-26T02:00+01:00[Europe/Berlin]
于 2016-01-04T17:11:00.153 回答