2016-11-07 3 views
-1

Я пытаюсь создать формат ISO 8601 («yyyy-MM-dd'T'HH: mm: ss.SSSXXX»). Ia m using Java 8 DateFormatBuilder для анализа строки в формате ISO 8601.Java 8 API DateFormatBuilder для построения ISO 8601 Формат даты

Когда я сталкиваюсь с временем UTC, выход форматирования «2016-11-01T16: 51: 35.000Z», но мне действительно нужно, чтобы 00:00 вместо Z. Я попытался использовать DateFormatBuilder для создания этого, но без успеха.

я, наконец, в конечном итоге делает следующие

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); 
DATETIMEFOMATTER = builder.parseCaseInsensitive() 
       .append(DateTimeFormatter.ISO_OFFSET_DATE_TIME) 
       .toFormatter(); 

ZonedDateTime zonedDate = ZonedDateTime.parse(date, DATETIMEFOMATTER); 
     String utcDate = zonedDate.format(FORMATTER); 
     if (utcDate.indexOf("Z") != -1){ 
      utcDate = utcDate.replace("Z", "-00:00"); 
     } 

Я не хочу, чтобы разобрать строку и заменить Z с «00:00». API Joda легче работать. Любая идея, если мы можем построить с использованием Java 8 DateTimeFormatterBuilder? Я действительно ссылался на несколько вопросов stackoverflow, но не работал. Возможно, я что-то делаю неправильно. Может кто-нибудь помочь?

+0

[ 'appendPattern'] (https://docs.oracle.com/javase/8/docs/api /java/time/format/DateTimeFormatterBuilder.html#appendPattern-java.lang.String-)? Вы написали формат в вопросе, я не уверен, в чем проблема. – Tunaki

+0

Thats не работает для меня. – Milind

+0

Определите «не работает», пожалуйста. Опубликовать попытку, а также исключения/или что-то еще, что произошло? – Tunaki

ответ

1

Встроенный

Поддержка стандартных форматов ISO 8601 для значений даты и времени строится на классы java.time. Нет необходимости указывать шаблон форматирования.

Ваши строки ввода могут быть проанализированы непосредственно классом Instant.

Instant instant = Instant.parse("2016-11-01T16:51:35.000Z"); 

Чтобы сформировать подобную строку с таким количеством дробных цифр, второй по мере необходимости в группах по три (0, 3, 6 или 9 цифр), просто вызовите toString().

String output = instant.toString(); 

2016-11-01T16: 51: 35Z

Z является стандартным и общим для бизнеса, аэрокосмической и военной. Номер Z не подходит для Zulu и означает UTC.

В то время как Z должно быть совершенно приемлемым, вы, кажется, запрашиваете смещение-от-UTC как число нулевых часов и нулевых минут, +00:00. В то время как положительное количество нулевых часов & минут также является приемлемым, минус -00:00 является не приемлемым и нарушает ISO 8601. Использование вашего отрицательного нулевого смещения вашего вопроса должно быть заменено положительным нулем.

Отметьте, что RFC 3339 предположительно является профилем ISO 8601, но нарушает это правило, допускает отрицательное смещение нуля и дает особое и запутанное значение. Не единственное плохое дизайнерское решение в RFC 3339. Поэтому я предлагаю избегать RFC и строго придерживаться ISO 8601.

Чтобы легко получить строку, которую Вы хотите с положительным нуля и не потрудившись с DateTimeFormatter явно использовать OffsetDateTime, а назначая смещение UTC уже определен как постоянный ZoneOffset.UTC. Затем просто позвоните toString.

OffsetDateTime odt = instant.atOffset(ZoneOffset.UTC); 
String output = odt.toString(); 

2016-11-01T16: 51: 35 + 00: 00

+0

Мне нужны оба этих выхода 2016-10-31T17: 10: 10.304-04: 00 и 2016-11-01T16: 51: 35.000-00: 00 из той же функции. Я посмотрю, если это возможно. Я должен иметь -00: 00 в качестве формата, так как услуга, которую я потребляю, нуждается в этом именно так. – Milind

+1

@Milind Перечитайте мой ответ, поскольку я предостерег от использования отрицательного нуля. Что касается необходимости '-04: 00', я должен подумать, что имя класса' OffsetDateTime' было бы ключом. Вы потрудились посмотреть на классный документ? –

+0

Я буду использовать его и вернуться к вам. Спасибо за ваш ответ. – Milind

Смежные вопросы