我有一个测试:
@Test
public void testJodaStartDate2a() {
DateTime dateTime = new DateTime(2010,10,10,4,0, DateTimeZone.forID("America/Caracas"));
MutableDateTime mutableDateTime = dateTime.toMutableDateTime();
mutableDateTime.setDate(dateTime);
assertEquals(dateTime, mutableDateTime.toDateTime());
}
这很简单,在其中我想将 dateTime 值的日期部分设置为 dateTime 值的日期部分,这应该是有效的,并且断言应该成功。然而它失败了。
由于我无法调试 Joda 的方法,我创建了另一个测试,它模拟 setDate() 必须执行的操作:
@Test
public void testJodaStartDate() {
DateTime dateTime = new DateTime(2010,10,10,4,0, DateTimeZone.forID("America/Caracas"));
long instantMillis = DateTimeUtils.getInstantMillis(dateTime);
Chronology instantChrono = DateTimeUtils.getInstantChronology(dateTime);
DateTimeZone zone1 = instantChrono.getZone();
if (zone1 != null) {
instantMillis = zone1.getMillisKeepLocal(DateTimeZone.UTC, instantMillis);
}
MutableDateTime mutableDateTime = dateTime.toMutableDateTime();
mutableDateTime.setMillis(mutableDateTime.getChronology().millisOfDay().set(instantMillis,
mutableDateTime.getMillisOfDay()));
assertEquals(dateTime, mutableDateTime);
}
此测试是 setDate() 内容的副本。正如我在调试过程中看到的那样,起初,之后
long instantMillis = DateTimeUtils.getInstantMillis(dateTime);
InstantMillis 变量的值是 1286699400000,即 2010-10-10 04:00 (VET) 和 2010-10-10 08:30 (UTC)。
后
instantMillis = zone1.getMillisKeepLocal(DateTimeZone.UTC, instantMillis);
InstantMillis 是 1286683200000,即 2010-10-10 00:00 (VET) 和 2010-10-10 04:00 (UTC)。
在断言中, mutableDateTime的毫秒值为 1286613000000,即 2010-10-09 04:00 (VET) 和 2010-10-09 08:30 (UTC)。
这个函数不应该只是将 mutableDateTime 的日期部分重新计算为参数值的日期部分吗?我在测试中缺少什么?我非常感激。