【发布时间】:2019-02-21 02:07:41
【问题描述】:
考虑代码:
import org.junit.Test;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author nsheremet
*/
public class MyTest {
private static final Date CREATED_ON = new Date(0L);
@Test
public void someTest() {
LocalDate actualDate = CREATED_ON.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
assertThat(actualDate).isEqualTo(LocalDate.of(1970, 01, 01));
}
}
在我的机器上运行良好,但在其他机器上却出现异常:
[ERROR] Failures:
[ERROR] MyTest.someTest:23 expected: <19[70-01-0]1> but was:<19[69-12-3]>1
为什么会这样?使用UTC 代替ZoneId.systemDefault() 是否正确?
【问题讨论】:
-
Date(时间线上的瞬间)和LocalDate(在某些特定时区,理论上是 24 小时长的时间段)在类型上存在根本区别。您可以仅参考特定时区进行转换。 -
@smac89 "我相信 LocalDate 可以扩展的最远距离是 Epoch" you believe wrongly。
-
LocalDate.EPOCH? -
这是
Date的问题之一,尽管类名定义了一个时间点,并且在那个时间点上,不同时区总会有不同的日期。 -
在 epoch,日期是 1970-1-1 或 1969-12-31,具体取决于您所在的时区。使用 UTC,GMT+0 到 GMT+12 恰好在这种情况下工作,但是,如果
Date不是在 GMT+0 的午夜,您选择的时区仍然会有所不同。