Собственный формат в XMLGregorianCalendar

Я пытаюсь сохранить формат YYYYww в XMLGregorianCalendar, но не смог найти никакого способа. Есть ли способ сохранить только год и неделю в XMLGregorianCalendar?

Я не мог найти какие-либо решения, используя другой форматер.

2 ответа

String week = data.getWeek();
week = week.substring(4,6);

Calendar cal = Calendar.getInstance();
cal.set(Calendar.WEEK_OF_YEAR, Integer.parseInt(week));
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
Date date = cal.getTime();

GregorianCalendar c = new GregorianCalendar();
c.setTime(date);
return DatatypeFactory.newInstance().newXMLGregorianCalendar(c);

Решение.

Я бы пошел так:

    DateTimeFormatter yearWeekFormatter = new DateTimeFormatterBuilder()
            .appendPattern("YYYYww")
            .parseDefaulting(ChronoField.DAY_OF_WEEK, 1)
            .toFormatter();
    LocalDate date = LocalDate.parse(week, yearWeekFormatter);
    XMLGregorianCalendar newXgc = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(date.toString());
    System.out.println(newXgc);

Используя week строка 201749 (49 неделя 2017 года) фрагмент кода печатает:

2017-12-04

Также возможно, что вы можете обойтись без XMLGregorianCalendar поскольку LocalDate.toString() производит точно такой же формат.

XML не имеет представления недели. Нам нужно выбрать дату. Как и в вашем собственном ответе, я выбираю первый день недели, понедельник. parseDefaulting(ChronoField.DAY_OF_WEEK, 1) указывает, что, так как в строке нет разбираемого дня недели, следует использовать первый день недели.

Немного в стороне, формат даты XML напоминает ISO 8601, международный стандарт для форматов даты и времени. Но это не то же самое. В ISO 8601 как (в отличие от XML) вы можете представлять календарную неделю в формате 2017-W49, Если вы хотите произвести это:

    DateTimeFormatter isoWeekFormatter = DateTimeFormatter.ofPattern("YYYY-'W'ww");
    System.out.println(date.format(isoWeekFormatter));

Выход:

2017-W49

связи

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