Разница между JodaTime и Календарем за годы до 1900 - PullRequest
3 голосов
/ 13 января 2011

Я получаю разные значения в миллисекундах за одну и ту же дату в прошлом при использовании JodaTime lib и java.util.Calendar.Например, для первого года AD

void test() {
    int year = 1;
    DateTime dt = new DateTime(year, 1,1,0,0,0,0);
    dt = dt.toDateTime(GregorianChronology.getInstance());

    Calendar cal = Calendar.getInstance();
    cal.clear();
    cal.set(year, 0, 1, 0, 0, 0);

    DateTime endDate = new DateTime(cal.getTimeInMillis());
    endDate = endDate.toDateTime(GregorianChronology.getInstance());

    System.out.println("JodaTime: " + dt);
    System.out.println("JodaTime, ms: " + dt.getMillis());
    System.out.println("Calendar: " + cal.getTime());
    System.out.println("Calendar, ms: " + cal.getTimeInMillis());
    System.out.println("JodaTime by Calendar: " + endDate);
}

По умолчанию DateTime использует ISOChronology, а Calendar - GregorianCalendar (кроме локалей TH и JA).Поэтому я установил GregorianChronology, но ничего не изменилось.Результат выполнения -

JodaTime:       0001-01-01T00:00:00.000+01:34:52
JodaTime, ms:   -62135602492000
Calendar:       Sat Jan 01 00:00:00 EET 1
Calendar, ms:   -62135776800000
JodaTime by Calendar:   0000-12-29T23:34:52.000+01:34:52

Может кто-нибудь подсказать, что я не так с чем-то?

Ответы [ 2 ]

4 голосов
/ 13 января 2011

My думаю, , что это связано с вашим часовым поясом. Укажите UTC, чтобы удалить его из уравнения.

В некоторых часовых поясах (например, в Париже) произошли некоторые «интересные» переходы.

Например, zoneinfo предполагает, что Европа / Афины имели смещение от 1:34:52 до 1916 г. (переход от сокращения LMT к AMT в 1895 г.).

Беларусь имела смещение 1:50:16 до 1880 года.

Возможно, Java использует другой источник данных о часовых поясах, который не включает эти странности?

2 голосов
/ 13 января 2011

После некоторых тестов я обнаружил следующие вещи:

  1. Проблема в том, что мой код использует часовой пояс Европы / Афин.У него смещение 2 часа, и до 1916 года оно было равно 1:34:52 (спасибо Джону Скиту за помощь).Но только Йода Тайм знает об этом =).Вот почему у меня была разница с 1582 по 1916 годы (а не с 1900 года, как я предполагал раньше). Так что с 1582-10-15 и Календарь Солнца, и Время Джода действуют аналогично (если вы используете часовой пояс UTC)

  2. Но если вы попытаетесь создать 1582-10-14, используя java.util.Calendar (cal.set (1582, 9, 14, 0, 0, 0);), вы получите вс 24 октября 00:00:00 EET 1582 (и точная дата в Joda Time).То же самое верно для 05-14.10.1582.До 1582-10-05 вы получите правильное строковое представление для Календаря, но с другим значением в миллисекундах.И разница становится меньше по какому-то правилу.Вот почему в моем примере это было 3 дня отставания.Насколько я помню, это связано с юлианским календарем

Спасибо всем за помощь

...