XMLGregorianCalendar формат даты в ZonedDateTime

У меня есть функция, которая принимает дату и дает XMLGregorianCalendar отформатированную дату, как показано ниже, которая возвращает дату как 2017-11-30T00:00:00.000-08:00 когда дата указана как 2017-11-30

public static String xmlDate(Date date) {
    XMLGregorianCalendar xmlDate = null;
    if (date != null) {
        GregorianCalendar gc = new GregorianCalendar();
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        gc.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
        gc.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        gc.set(Calendar.MILLISECOND, 0);

        try {
            xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
        } catch (DatatypeConfigurationException e) {
            //exception
        }
    }
    return xmlDate.toString();
}

Я пытаюсь переписать вышеуказанную функцию с Java 8 ZonedDateTime, но получаю дату как 2017-11-29T00:00:00-08:00.Как я могу получить точно такой же вывод, как и вышеупомянутая функция? Также я не понимаю, почему дата 29 вместо 30.

public static String zonedDatetime(Date date) {
    return ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("America/Los_Angeles"))
            .truncatedTo(ChronoUnit.DAYS)
            .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}

1 ответ

Решение

При условии, что date в это мгновение причина, по которой вы получаете 29-е, состоит в том, что в этот момент это дата в Лос-Анджелесе (22:53 PST).

Если вы хотите сопоставить локальную дату, то вы, вероятно, после чего-то вроде этого:

return ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault())
            .withZoneSameLocal(ZoneId.of("America/Los_Angeles"))
            .truncatedTo(ChronoUnit.DAYS)
            .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
Другие вопросы по тегам