【发布时间】:2016-10-07 01:15:21
【问题描述】:
这出乎我的意料:
> Clock clock = Clock.systemUTC();
> Instant.now(clock).minus(3, ChronoUnit.DAYS);
java.time.Instant res4 = 2016-10-04T00:57:20.840Z
> Instant.now(clock).minus(3, ChronoUnit.YEARS);
java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Years
作为一种解决方法,我必须这样做:
> Instant.now(clock).atOffset(ZoneOffset.UTC).minus(3, ChronoUnit.YEARS).toInstant();
java.time.Instant res11 = 2013-10-07T01:02:56.361Z
我很好奇 Instant 为什么不支持 YEARS。开发者就放弃了吗?
(在我的实际代码中,我尝试减去 Period.ofYears(3),但引用的 Instant 方法是最后被调用的方法)。
【问题讨论】:
-
我的实际问题是,为什么支持
ChronoUnit.DAYS。这是不一致的...... -
与什么不一致?我的期望是,如果一个方法需要一个时间单元(Period),那么它知道如何处理它,所以当它失败时会令人惊讶。
-
当使用更高精度的精确单位(即秒、微秒甚至纳秒)进行测量时,天的长度不是恒定的。一旦你开始支持天,假设它们正好是 86400 秒,你就放弃了,例如秒、微秒和纳秒,以及构建为秒的明确倍数的单位,即分钟和小时。所以奇怪的是有一个类支持 nanos、micros、millis、seconds、minutes、hours、和 days,其中对天数的支持将所有前者变成了伪单位。
-
有趣的是,这个问题还没有答案。我确信一定有原因,但我无法在任何地方找到解释。只建议改用什么...
-
“我清楚地说,我的问题是“为什么”” - 开发人员做出了选择。除非你能从开发者那里得到答案,否则问题是“基于意见的”,不是吗?