带小时、分钟和秒的周期

Period with hours, minutes and seconds

我需要一个表示年、月、周、日、小时、分钟、秒的间隔数据类型。前三个(年、月、日)可以用 Period 完成,后三个(小时、分钟、秒)可以用 Duration 完成,但是 none 似乎可以两个都。理想情况下,我想避免必须实施自定义 TemporalAmount.

没有这种类型是有原因的。没有明确定义的时间间隔,例如 "day"、"month" 或 "year":

  • 一天并不总是 24 小时(取决于 DST、时区和闰秒)
  • 每个月的天数都不一样
  • 闰年有 366 天

即使您实现了自定义 TemporalAmount,在某些情况下您的代码也很有可能不正确。如果您陈述您的实际需求,您可能会得到更好的答案。

之所以不存在这样的 class 是因为实际上有两种不同的时间概念:(1) 固定 秒数(例如)叫一个Duration in Java world or (2) a let's say variable number of seconds which is called a Period。期间试图从

的变化长度中抽象出来
  • 分钟(闰秒,未实现)
  • 天(夏令时)
  • 个月(28、29、30、31 天)
  • 年(闰年)

这就是为什么 Period 存储日、月、年,而 Duration 只存储秒和纳秒。是的,它们确实共享相同的时间单位 DAY,但是 Duration 天被认为是 24 小时并直接转换为秒。

2016-02-01 和 2016-03-01 之间的时间是 1 个月。持续时间是 696 小时,而不是 720 小时。你可以说一个时期的持续时间可能会改变。

因此您需要定义您的应用程序。您想要持续时间(固定的秒数)还是周期("happens" 一年一次)?

这是他们如何在夏令时更改后计算不同时刻的示例:

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]