Java: неправильный час из экземпляра календаря? - PullRequest
0 голосов
/ 02 декабря 2018

Бег:

public class test {
    @Test
    public void displayDate() {
        SimpleDateFormat MONTH_FORMAT = new SimpleDateFormat("MMM", Locale.getDefault());
        String testDateStr = "2017-07-01T07:58:23.000Z";
        Calendar calendar = getFormatedDate(testDateStr);
        int yearInt  = calendar.get(Calendar.YEAR);
        String monthStr = MONTH_FORMAT.format(calendar.getTime()).toUpperCase();
        int monthInt = calendar.get(Calendar.MONTH);
        int dayInt  = calendar.get(Calendar.DAY_OF_MONTH);
        int hour24 = calendar.get(Calendar.HOUR_OF_DAY);
        int min = calendar.get(Calendar.MINUTE);
        int sec = calendar.get(Calendar.SECOND);
        System.out.println(testDateStr);
        System.out.println(String.format("%s-%s-%s %s:%s:%s", yearInt, monthStr, dayInt, hour24, min, sec));
        System.out.println(String.format("%s-%s-%s %s:%s:%s", yearInt, monthInt, dayInt, hour24, min, sec));

    }

    private Calendar getFormatedDate(String dateStr) {
        Instant instant;
        try {
            instant = Instant.parse(dateStr);
        } catch (DateTimeParseException e) {
            e.printStackTrace();
            return null;
        }
        ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
        Calendar calendar = GregorianCalendar.from(zdt);
        return calendar;
    }
}

Я получаю:

2017-07-01T07:58:23.000Z
2017-JUL-1 9:58:23
2017-6-1 9:58:23

Обратите внимание, я получаю час = 9, в то время как ожидается 7

Вопросы

  1. Почему этот результат
  2. Как получить правильный результат?

Спасибо!

1 Ответ

0 голосов
/ 02 декабря 2018

Почему этот результат

Из-за этой строки: ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
Вы заставляете свой часовой пояс сверх того, который определен в dateStr, поэтому Календарь будет использовать ваш часовой пояс вместо исходного.

Как получить правильный результат?

Измените свой метод getFormatedDate на:

private Calendar getFormatedDate(final String dateStr) {
    final ZonedDateTime zdt = ZonedDateTime.parse(dateStr);
    return GregorianCalendar.from(zdt);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...