Ошибка преобразования XMLGregorianCalendar в строку

Следующий фрагмент кода работает отлично для дат с годом выше 1600 или так. Но это дает неправильный результат в течение многих лет, как 1001, 1500, 1400 и т.д. Можете ли вы объяснить, почему?

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");

XMLGregorianCalendar cal DatatypeFactory.newInstance().newXMLGregorianCalendar("1600-01-01");

String birthDate = format.format(cal.toGregorianCalendar().getTime());

System.out.println(birthDate);

3 ответа

Я уверен, что григорианский календарь появился в 1582 году, что объясняет, почему он работает на 1600, а не на 1500.

Причиной того, что DateFormat отображает "неправильный" год после преобразования XMLGregorianCalendar в GregorianCalendar, является тот факт, что по умолчанию GregorianCalendar.getGregorianChange() имеет значение 1582-10-15.

Если для GregorianCalendar установлена ​​дата, предшествующая дате изменения григорианского календаря, он фактически будет представлять даты в юлианском календаре, в результате чего год будет казаться "неправильным", поскольку длина года для этих двух календарей различна,

Исправить это можно с помощью GregorianCalendar.setGregorianChange(), чтобы установить это значение на более раннюю дату, чтобы избежать его перехода на юлианский календарь.

Я не совсем уверен. Но я думаю, что это относится к эпохе (дата), но... эпоха начинается в 1970 году (а не в 1960 году).

Также у григорианского календаря есть некоторые ограничения (я не могу упомянуть каждое из них, но..), например, вы не можете использовать дату с "нулевого" года, это не может быть правильно истолковано (я думаю, что дата вышла за пределы Anno Domini и вместо этого вы должны обратиться к до Христа... я не уверен).

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

Другие вопросы по тегам