- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个测试:
@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 (世界标准时间)..
这个函数不是应该将 mutableDateTime 的日期部分重新计算为参数值的日期部分吗?我在测试中缺少什么?我非常感激。
最佳答案
您似乎发现了一个错误。
以下行是错误的——它应该使用this
正在使用的时区。
instantMillis = zone1.getMillisKeepLocal(DateTimeZone.UTC, instantMillis);
快速搜索尚未发现当前错误。我现在已经提交了一份 ( here )。
我运行了一些测试来检查这次哪些时区有问题。基本上,当给定时区的日期与 UTC 的日期(同一时刻)不同时,就会出现问题。
@Test
public void minus0401() {
DateTime dateTime = new DateTime("2010-10-10T04:00:00",
DateTimeZone.forOffsetHoursMinutes(-4, 1));
testDate(dateTime);
}
@Test
public void testIds() {
List<String> failedIds = new ArrayList<>();
for (String id : DateTimeZone.getAvailableIDs()) {
DateTime dateTime = new DateTime("2010-10-10T04:00:00",
DateTimeZone.forID(id));
try {
testDate(dateTime);
} catch (AssertionError e) {
failedIds.add(id);
}
}
assertEquals(failedIds.toString(), 0, failedIds.size());
}
@Test
public void testHours() {
List<Integer> failedHours = new ArrayList<>();
for (int i = -12; i < 12; i++) {
DateTime dateTime = new DateTime("2010-10-10T04:00:00",
DateTimeZone.forOffsetHours(i));
try {
testDate(dateTime);
} catch (AssertionError e) {
failedHours.add(i);
}
}
assertEquals(failedHours.toString(), 0, failedHours.size());
}
private void testDate(DateTime dateTime) {
MutableDateTime mutableDateTime = dateTime.toMutableDateTime();
mutableDateTime.setDate(dateTime);
assertEquals(dateTime, mutableDateTime.toDateTime());
}
关于java - Joda MutableDateTime 的 setDate(DateTime) 方法如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12623566/
我有一个测试: @Test public void testJodaStartDate2a() { DateTime dateTime = new DateTime(2010,10,10,4,
我的代码的输出是0,0,0。我本来期待的是 0, -1 , 1 。代码中有什么问题?为什么我不能在 DateTime 中添加或减去秒? public static void main(String[]
我不明白为什么 MutableDateTime.setDate() 将时间设置为“昨天”(查看日志时间戳小时数 - 现在是 20:28)。这个时区相关吗?我需要在格式化程序上设置一些东西吗? 我希望在
我是一名优秀的程序员,十分优秀!