java.time.Clock
提供对millis
和instant
的访问权限,但不能访问任何依赖时区的内容。但是它包含一个时区,并且需要一个时区才能进行构建。它似乎仅用于equals / hashcode。
static final class SystemClock extends Clock implements Serializable {
private static final long serialVersionUID = 6740630888130243051L;
private final ZoneId zone;
SystemClock(ZoneId zone) {
this.zone = zone;
}
@Override
public ZoneId getZone() {
return zone;
}
@Override
public Clock withZone(ZoneId zone) {
if (zone.equals(this.zone)) { // intentional NPE
return this;
}
return new SystemClock(zone);
}
@Override
public long millis() {
return System.currentTimeMillis();
}
@Override
public Instant instant() {
return Instant.ofEpochMilli(millis());
}
@Override
public boolean equals(Object obj) {
if (obj instanceof SystemClock) {
return zone.equals(((SystemClock) obj).zone);
}
return false;
}
@Override
public int hashCode() {
return zone.hashCode() + 1;
}
@Override
public String toString() {
return "SystemClock[" + zone + "]";
}
}
是否有必要在此类中加入ZoneId
?
答案 0 :(得分:4)
docs将Clock的整个目的描述为基本上是一个(毫秒发生器,时区)对,尤其是用于测试:
此类的实例用于查找当前时刻,可以使用存储的时区来解释当前时刻以查找当前日期和时间。因此,可以使用时钟代替System.currentTimeMillis()和TimeZone.getDefault()。
使用时钟是可选的。所有关键日期时间类还具有now()工厂方法,该方法在默认时区使用系统时钟。 此抽象的主要目的是允许在需要时插入备用时钟。应用程序使用对象而不是静态方法来获取当前时间。 这可以简化测试。
(添加了重点)
例如,如果要测试类在特定时区的特定瞬间的行为,可以插入Clock.fixed
实例。在生产代码中,您将使用Clock.system*
工厂之一。