ISO datetime с проблемой часового пояса - PullRequest
1 голос
/ 18 марта 2019

Я просто печатаю дату и время ISO с часовым поясом в соответствии с приведенной ниже документацией http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a003169814.htm

Это мой код

TimeZone tz = TimeZone.getTimeZone("UTC");
        DateFormat df = new SimpleDateFormat("yyyy-mm-dd'T'hh:mm:ss.nnnnnn+|-hh:mm"); 
        df.setTimeZone(tz);
        dateTimeWithTimeZone = df.format(new Date());

Однако я получаю это исключение
Нелегальная модель персонажа 'n' Я не могу использовать этот формат непосредственно в Java?

1 Ответ

2 голосов
/ 19 марта 2019

java.time

    dateTimeWithTimeZone = Instant.now().toString();
    System.out.println(dateTimeWithTimeZone);

Когда я только что запустил этот фрагмент, я получил такой вывод:

2019-03-18T22: 28: 13.549319Z

Это не ясно со страницы, на которую вы ссылаетесь, но это строка ISO 8601 в UTC, так что должно быть все, что вам нужно. Я использую тот факт, что классы java.time создают выходные данные ISO 8601 из своих методов toString. Связанная страница показывает формат с дефисами, T и двоеточиями (2008-09-15T15:53:00+05:00), показывает еще один пример с десятичными знаками в секундах (15:53:00.322348) и третий пример с Z, означающим UTC (20080915T155300Z) так что я ожидаю, что комбинация всех этих трех тоже будет в порядке.

Формат, который вы использовали в задании, похоже, пытается получить смещение как +00:00, а не Z. Если это требование, это только немного сложнее. Мы используем явный форматер для контроля изменений в ISO 8601:

        DateTimeFormatter iso8601Formatter
                = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSSxxx");
        dateTimeWithTimeZone = OffsetDateTime.now(ZoneOffset.UTC).format(iso8601Formatter);
        System.out.println(dateTimeWithTimeZone);

2019-03-18T22: 28: 13,729711 + 00: 00

Что пошло не так в вашем коде?

Вы пытались использовать символы форматирования из вашего источника с SimpleDateFormat. Во-первых, вы никогда не должны, и особенно в Java 8 или более поздней версии, использовать SimpleDateFormat. Этот класс, как известно, хлопотно и давно устарел. Во-вторых, некоторые из его букв шаблонного формата соответствуют символам из вашего источника, а некоторые - нет, поэтому вы не можете просто использовать строку symvol оттуда. Вместо этого вам нужно прочитать документацию и найти правильные буквы шаблонов форматов для года, месяца и т. Д. И помните, что они чувствительны к регистру: MM и mm различны.

Ссылка

Учебное пособие по Oracle: Дата и время объясняя, как использовать java.time.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...