Почему JodaTime и Календарь возвращают разные результаты

Почему этот тест не выполняется:

    DateTime dateTime = new DateTime(1997,01,01,00,00,00,00, DateTimeZone.UTC);
    long jodaMills = dateTime.getMillis();

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.set(1997,01,01,00,00,00);
    long calMills = cal.getTimeInMillis();

    Assert.assertEquals(jodaMills, calMills);

Я получаю результат: Ожидаемое: 852076800000 Актуально: 854755200964

Разве они не должны быть одинаковыми?

Ответ 1

Две причины:

  • У Джоды есть месяцы. Поэтому вам нужно это изменить.

  • Календарь плохо разработан. Вы не устанавливаете миллисекунды секунды в 0. cal.set(MILLISECOND, 0)

Вот javadoc

public final void set (int year,                       int month,                       int date,                       int hourOfDay,                       int minute,                       int second)

Отсутствует поле миллисекунды.

Ответ 2

Календарь имеет нулевые месяцы, а месячные месяцы JodaTime начинаются с 1.

Итак, в JodaTime, январь - месяц 1, но в календаре январь - месяц 0.

Поэтому в вашем примере вы сравниваете 1 января до 1 февраля, следовательно, разница в значениях.

Также существует разница в миллисекундах, так как JodaTime устанавливается на ноль, но объект Calendar не является.

Ответ 3

Нулевые и однонаправленные обозначения

Ответ 4

Я собираюсь предположить, что 1997, 01,01 для Joda означает 1 января 1997 года.

Но в Java-календаре месяцы пронумерованы от 0 до 11, поэтому 1997,01,01 для Java на самом деле 1 февраля.

Лучший подход - использовать

cal.set(1997, Calendar.JANUARY, 01, 00,00,00);

Вы также должны reset MILLISECONDS объекта Calendar в 0, как указывал @Amir.