Преобразование григорианского календаря Java в строку

У меня есть класс книги, и один из его атрибутов:

private Calendar publish_date;

Теперь я хотел бы вставить новую книгу в файл library.xml. Итак, я создаю книгу:

Book b = new Book();
b.setPublish_date(new GregorianCalendar(1975, 5, 7));

Мне нужно, чтобы эта дата была строкой, чтобы я мог записать ее в файл XML (используя DOM). Итак, я выполняю:

    Element publish_date = doc.createElement("publish_date");
    SimpleDateFormat formatter=new SimpleDateFormat("yyyy MM DD"); 
    publish_date.appendChild(doc.createTextNode(formatter.format(b.getPublish_date())));
    book.appendChild(publish_date);

но это ошибка:

java.lang.IllegalArgumentException: Cannot format given Object as a Date
at java.text.DateFormat.format(DateFormat.java:301)
at java.text.Format.format(Format.java:157)
at fileLock.FileLock.updateLibrary(FileLock.java:127)
at fileLock.FileLock.main(FileLock.java:63)

так каков правильный способ преобразования календаря (григорианского календаря) в строку? Спасибо


person SagittariusA    schedule 14.07.2014    source источник
comment
попробуйте formatter.format(b.getPublish_date().getTime()); метод формата принимает дату в качестве типа параметра   -  person DwB    schedule 14.07.2014


Ответы (2)


SimpleDateFormat не может форматировать GregorianCalendar; он может форматировать Date, поэтому сначала преобразуйте его в Date. Вы получаете 158 в качестве дня, потому что DD — это день года, а dd (нижний регистр) — это день месяца.

SimpleDateFormat formatter=new SimpleDateFormat("yyyy MM dd");   // lowercase "dd"
publish_date.appendChild(doc.createTextNode(formatter.format(
    b.getPublish_date().getTime() )));

Кроме того, вы, возможно, знали, а могли и не знать, что номера месяцев в Java — от 0 до 11, поэтому при форматировании месяц 5 — это июнь, поэтому получается 06.

Выход:

1975 06 07
person rgettman    schedule 14.07.2014
comment
Большое спасибо! Я привык использовать Date, но заметил, что он устарел. Я начинаю использовать григорианский календарь, и я все еще новичок... спасибо - person SagittariusA; 14.07.2014
comment
Разве Date не устарела сейчас? - person Kingand; 10.08.2017