带小时、分钟和秒的周期
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]
我需要一个表示年、月、周、日、小时、分钟、秒的间隔数据类型。前三个(年、月、日)可以用 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]