我需要一种表示年,月,周,日,小时,分钟,秒的间隔数据类型。前三个(年,月,日)可以使用Period
完成,最后三个(小时,分钟,秒)可以使用Duration
完成,但是他们似乎都不会同时执行这两项操作。理想情况下,我希望避免实施自定义TemporalAmount
。
答案 0 :(得分:3)
有一个原因就是没有这种类型。没有明确定义的时间间隔,例如" day"," month"或"年":
即使您实现了自定义TemporalAmount,在某些情况下您的代码也很可能不正确。如果您说明您的实际要求,您可能会得到更好的答案。
答案 1 :(得分:2)
没有这样的类存在的原因是实际上存在两种不同的时间概念:(1) fixed 数量(例如)秒在Java中称为Duration世界或(2)让我们说变量秒数,称为Period。期间试图从改变
的长度中抽象出来这就是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]