Почему 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.