Как преобразовать дату и время UT C в формат ISO 8601 в Java? - PullRequest
1 голос
/ 28 февраля 2020

Я хочу отформатировать время UT C в определенном формате c ISO 8601, например 2020-02-28T14: 10: 23 + 00: 00 , но не 2020 -02-28T14: 10: 23Z . Я не хочу Z в конце, но +00: 00. Я попробовал все форматы в simpleDateFormat do c, и ни один из форматов, по-видимому, не дает вышеупомянутый.

Я знаю, что оба представляют одно и то же время независимо от формата, но его необходимо отформатировать таким образом, чтобы обеспечить обратную совместимость.

Вот код java, который я пробовал,

final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(sdf.format(new Date()));

Этого можно достичь, заменив z на +00: 00 в отформатированной строке, но, похоже, это не так хороший вариант.

1 Ответ

4 голосов
/ 28 февраля 2020

В соответствии с документацией из DateTimeFormatter

Смещение X и x : форматирование смещения на основе количества букв шаблона. Одна буква выводит только час, например, «+01», если минута не равна нулю, в этом случае также выводится минута, например, «+0130». Две буквы выводят час и минуту без двоеточия, например «+0130». Три буквы выводят часы и минуты с двоеточием, например, «+01: 30» . Четыре буквы выводят час и минуту и ​​необязательную секунду без двоеточия, например «+013015». Пять букв выводят часы и минуты и необязательную секунду с двоеточием, например «+01: 30: 15». Шесть или более букв выбрасывают исключение IllegalArgumentException. Буква шаблона «X» (верхний регистр) будет выводить «Z», когда выводимое смещение будет равно нулю, тогда как буква шаблона «x» (нижний регистр) будет выводить «+00», «+0000» или '+00: 00' .

Попробуйте с xxx как в:

DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx").format(ZonedDateTime.now())

, который возвращает что-то вроде

2020-02-28T12:42:30+00:00

На основе Java версия 13, протестировано с jshell OpenJDK 13; DateTimeFormatter доступно в Java 8 или новее

...