воскресенье, 7 июня 2015 г.

Конвертирование дат из XMLGregrorianCalendar в GregorianCalendar

При парсинге xml файла наткнулся на следующую проблему. Даты ранее 1582 года содержащиеся в XMLGregorianCalendar некорректно конвертируются в GregorianCalendar.
 
 XMLGregorianCalendar beforeDate = DatatypeFactory.newInstance().newXMLGregorianCalendar();
 beforeDate.setDay(11);
 beforeDate.setMonth(11);
 beforeDate.setYear(1581);
 XMLGregorianCalendar alterDate = DatatypeFactory.newInstance().newXMLGregorianCalendar();
 alterDate.setYear(1582);
 alterDate.setMonth(11);
 alterDate.setDay(11);

 SimpleDateFormat dateFormat = new SimpleDateFormat("dd:MMM:yyyy");
 System.out.println(dateFormat.format(beforeDate.toGregorianCalendar().getTime()));
 System.out.println(dateFormat.format(alterDate.toGregorianCalendar().getTime()));
Output:
  
  01:Jan:1581
  11:Jan:1582
Это происходит из-за перехода с Юлианского календаря на Грегорианский. Чтобы того не было, необходимо явно выставить дату.
GregorianCalendar calendar = new GregorianCalendar();
calendar.clear();
calendar.set(xmlCalendar.getYear(), xmlCalendar.getMonth() - 1, xmlCalendar.getDay());

SimpleDateFormat dateFormat = new SimpleDateFormat("dd:MMM:yyyy");
System.out.println(dateFormat.format(calendar.getTime()));
Output:
 11:Jan:1580