【问题标题】:Period with hours, minutes and seconds [closed]带小时、分钟和秒的时段[关闭]
【发布时间】:2016-01-04 16:05:58
【问题描述】:

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

【问题讨论】:

  • 我投票结束这个问题,因为这不是一个代码编写服务。
  • 为什么要提供代码编写服务?我无法理解 API。 “理想情况下,我希望避免实现自定义 TemporalAmount”。所以不,我不是在寻找代码,我在寻找理解。
  • 关于 JSR-310-team 放弃最初计划的混合时期(包括月、日、时间)支持的动机,请参阅 this old threeten-issue 我怀疑他们担心复杂性并且之前没有足够的时间发布 Java-8。好吧,写这样一个类确实很复杂,另见我的Duration-class 的大小——超过 5700 行。顺便说一句,Joda-Time-Period 也是这样一个类(也很复杂)。
  • 一个类似的question 仍处于打开状态,之前已发布过。

标签: java jsr310


【解决方案1】:

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

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

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

【讨论】:

  • 是的,请参阅 Period 类。
  • Period 仅支持年、月和日单位。它不支持小时、分钟等。
  • 是的,我知道 Period 仅支持年、月和日,这就是问题所说的。正如我所说,我会选择 Period 语义,所以 25 小时就是 25 小时。
  • 我想建模 PostgreS interval type
  • @PhilippeMarschall 然后您必须阅读文档: » 内部间隔值存储为月、日和秒。这样做是因为一个月中的天数不同,如果涉及夏令时调整,一天可以有 23 或 25 小时。月和日字段是整数,而秒字段可以存储分数。« 所以您需要创建一个由 Period 和 Duration 组成的类。您可以放心使用这些年,因为 PostgreSQL 的最大值为 178000000 年,而 Java Period 的最大值为 2147483647 年。你为什么不一开始就问那个
【解决方案2】:

没有这样的类存在的原因是实际上有两种不同的时间概念:(1) 固定 秒数(例如)在 Java 世界中称为 Duration 或(2) 假设 variable 秒数,称为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]

【讨论】:

  • 我愿意接受 Zoned/OffsetDateTime 上的 #addXXX 语义。
猜你喜欢
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 2016-06-29
  • 2021-01-23
  • 1970-01-01
  • 2023-03-10
  • 2019-01-27
相关资源
最近更新 更多