Почему JodaTime и Календарь дают разные результаты - PullRequest
11 голосов
/ 26 июля 2011

Почему этот тест не пройден:

    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

Разве они не должны совпадать?

Ответы [ 4 ]

22 голосов
/ 27 июля 2011

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

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

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

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

13 голосов
/ 27 июля 2011

Две причины:

  1. У Джоды месячные.Так что вам нужно это изменить.

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

Вот javadoc

публичный окончательный набор недействительных данных (int year, int month), int дата, int hourOfDay, int минута, int секунда)

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

4 голосов
/ 27 июля 2011

Обозначения на основе нуля и на основе единицы

3 голосов
/ 27 июля 2011

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

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

Лучшим подходом является использование -

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

Вы также должны сбросить MILLISECONDS объекта Calendar на0, как указал @Amir.

...