Форматирование проблемы с часовым поясом XmlGregorianCalendar - PullRequest
3 голосов
/ 11 февраля 2012

Мне нужно отформатировать Java XmlGregorianCalendar в строку "yyMMdd". Моя реализация:

XMLGregorianCalendar date = getDate(); //getting the date

if (date != null) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");

        LOG.debug("Parsing date...");
        LOG.debug("XML Date: " + date);
        LOG.debug("XML Date timezone: " + date.getTimezone());

        GregorianCalendar gc = date.toGregorianCalendar();

        LOG.debug("Gregorian calendar: " + gc.toString());
        LOG.debug("Gregorian calendar timezone id: " + gc.getTimeZone().getID());

        Date d = gc.getTime();

        LOG.debug("Date: " + d.toString());

        String formatted = sdf.format(d);

        LOG.debug("Formatted: " + formatted);
}

Что я вижу в журнале:

Parsing date...
XML Date: 1943-04-15T00:00:00.000Z
XML Date timezone: 0
Gregorian calendar: java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT+00:00",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=1943,MONTH=3,WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=15,DAY_OF_YEAR=1,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=0,DST_OFFSET=0]
Gregorian calendar timezone id: GMT+00:00
Date: Wed Apr 14 20:00:00 EDT 1943
Formatted: 430414

15 апреля был разобран как 14 апреля. Что я делаю не так? Когда я должен установить часовой пояс?

1 Ответ

4 голосов
/ 11 февраля 2012

Это было проанализировано как полночь 15 апреля UTC .Затем он был отформатирован как 8 вечера 14 апреля EDT , что правильно, так как EDT отстает на четыре часа от UTC.

Обратите внимание, что Date.toString() всегда использует местное времяzone - объект Date не имеет понятия, в каком часовом поясе он находится.

Ваше форматированное значение также с использованием часового пояса по умолчанию, поскольку вы не указали часовой пояс.Значение календаря (gc) указано в формате UTC, но при его форматировании будет применен часовой пояс из средства форматирования (при форматировании значения Date, которое не имеет времязона).

Не ясно, чего вы пытались достичь, но, надеюсь, это поможет.Кроме того, я настоятельно рекомендую вместо этого использовать Joda Time , если это возможно - многое из этого становится намного понятнее.

...