小时,分钟和秒的时间段

Phi*_*all 6 java jsr310

我需要一个表示年,月,周,日,小时,分钟,秒的间隔数据类型.前三个(年,月,日)可以完成,Period最后三个(小时,分钟,秒)可以完成,Duration但是它们似乎都没有.理想情况下,我希望避免实现自定义TemporalAmount.

kos*_*tya 5

没有这种类型是有原因的。没有明确定义的时间间隔,例如“日”、“月”或“年”:

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

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

  • 是的,有,请参见Period 类。 (2认同)
  • 是的,我知道 Period 只支持年、月和日,这就是问题所说的。正如我所说,我会选择 Period 语义,所以 25 小时就是 25 小时。 (2认同)
  • 我想对 PostgreS [间隔类型](http://www.postgresql.org/docs/9.4/static/datatype-datetime.html) 建模 (2认同)
  • @PhilippeMarschall 然后您必须阅读文档:»内部间隔值存储为月、日和秒。这样做是因为一个月中的天数各不相同,如果涉及夏令时调整,一天可能有 23 或 25 小时。月份和日期字段是整数,而秒字段可以存储分数。« 所以你需要创建一个由 Period 和 Duration 组成的类。您可以放心使用年数,因为 PostgreSQL 最多为 `178000000` 年,而 Java Period 的最大值为 `2147483647` 年。你为什么一开始不问*那个*? (2认同)

ste*_*fen 5

之所以没有这样的类,是因为时间跨度实际上是两个不同的概念。在 Java 中,这两个概念在两个不同的类中实现:

  • 固定数量(例如)秒是Java 世界中的Duration(想象一袋秒)
  • 较大时间单位(如一个月)中可变秒数,称为周期

虽然持续时间始终具有相同的时间长度,但期间的实际时间长度取决于其应用的时间和地点。一个月的期限可以是 28、29、30 或 31 天 - 实际持续时间取决于具体情况。当给定时区实行夏令时时,一天的时间可能有 23、24 或 25 小时(甚至更多)。

以下是影响周期到持续时间转换的因素的一小部分且可能不完整的列表。

  • 分钟(闰秒,***这尚未实现)
  • 天(夏令时)
  • 个月(28、29、30、31 天)
  • 年(闰年)

这就是为什么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)