0

私はテストをしています:

@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変数には、2010-10-10 04:00(VET)および2010-10-10 08:30(UTC)である1286699400000の値が割り当てられます。

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の日付部分をパラメーター値の日付部分に再計算するだけのものではありませんか?テストで何が欠けていますか?大変感謝しております。

4

1 に答える 1

1

バグを発見したようです。

次の行は間違っています-使用しているタイムゾーンを使用する必要がありますthis

instantMillis = zone1.getMillisKeepLocal(DateTimeZone.UTC, instantMillis);

クイック検索では、現在のバグは見つかりませんでした。私は今1つを提出しました(ここ)。

今回実行したいくつかのテストでは、今回問題となったタイムゾーンを確認しました。基本的に、問題は、特定のタイムゾーンの日付が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());
}
于 2012-09-27T15:52:27.230 に答える