我无法理解,或者说无法证明:
(isAfter(x) or isEquals(x)) == !isBefore(x)
和
(isBefore(x) or isEquals(x)) == !isAfter(x)
陈述总是如此
与
default boolean isAfter(ChronoZonedDateTime<?> other) {
long thisEpochSec = toEpochSecond();
long otherEpochSec = other.toEpochSecond();
return thisEpochSec > otherEpochSec ||
(thisEpochSec == otherEpochSec && toLocalTime().getNano() > other.toLocalTime().getNano());
}
default boolean isBefore(ChronoZonedDateTime<?> other) {
long thisEpochSec = toEpochSecond();
long otherEpochSec = other.toEpochSecond();
return thisEpochSec < otherEpochSec ||
(thisEpochSec == otherEpochSec && toLocalTime().getNano() < other.toLocalTime().getNano());
}
default boolean isEqual(ChronoZonedDateTime<?> other) {
return toEpochSecond() == other.toEpochSecond() &&
toLocalTime().getNano() == other.toLocalTime().getNano();
}
来自java.time.chrono.ChronoZonedDateTime;
答案 0 :(得分:1)
如果您的问题是,您是否可以证明isBefore
,isEqual
和isAfter
中只有一个是真的 - 是的,您可以。
this.toEpochSecond()
和other.toEpochSecond()
之间有三种可能的比较:<
,==
或>
。查看逻辑,很明显,如果比较为<
,则isBefore()
为真,isAfter()
和isEqual()
为假,因为>
和对==
的{{1}}比较将是错误的。同样,如果比较为toEpochSecond
,则>
为真,isAfter()
和isBefore()
为假。所以在这两种情况下,命题都成立了。
第三种情况怎么样,isEqual()
结果相同?然后我们比较toEpochSecond
,它可以是toLocalTime().getNano()
,<
或==
。如果我们看一下当>
结果相等且toEpochSecond
结果进行比较时代码的行为,我们发现在所有三种情况下,其中一种方法返回true而其他方法返回false。
所以从本质上讲,我们已经研究了五种可能的情况,并且在所有情况下,这三种方法中只有一种是正确的。既然我们已经证明了这一点,那么原始问题中的陈述就是这样:
getNano
也是如此。 QED
答案 1 :(得分:0)
阅读条件,
(isBefore(x) or isEquals(x)) == !isAfter(x)
如果您是before
或equal
,则不是after
。
示例:
如果您位于第二位或之后,则不能成为第一位。
如果两个条件都为真,则表示您是before
,equal
或after
。由于您不能after
和before
(除非您是一个盒子里的猫),您就是equal
。
这些条件非常简单,首先它会尝试将第二秒的时间与toEpochSecond()
进行比较。
然后,根据方法,它将检查纳秒值更精确。这部分将取决于方法。我们来一个:
default boolean isAfter(ChronoZonedDateTime<?> other) {
long thisEpochSec = toEpochSecond();
long otherEpochSec = other.toEpochSecond();
return thisEpochSec > otherEpochSec ||
(thisEpochSec == otherEpochSec && toLocalTime().getNano() > other.toLocalTime().getNano());
}
要检查this
后是否other
,我们需要检查this.seconds
是否大于other.seconds
。
thisEpochSec > otherEpochSec
如果没有,它将更深入并且仅在秒等于
时检查纳秒thisEpochSec == otherEpochSec // seconds equals
&& toLocalTime().getNano() > other.toLocalTime().getNano());