Формат даты и времени ISO 8601, сочетающий «Z» и смещение «+0000».

Я играю с форматом даты и времени из ISO 8601. У меня есть этот шаблон:

"yyyy-MM-dd'T'HH:mm:ssZZ'Z'"

и вывод:

"2015-11-17T00:00:00+0000Z".

Мой вопрос в том, в порядке ли вывод, если возможно иметь дату +0000 и Z, принимая во внимание, что оба имеют одинаковое значение смещения/идентификатора часового пояса. Заранее спасибо за разъяснения =)


person Zilev av    schedule 07.03.2016    source источник
comment
@BasilBourque Я не думаю, что это требует пояснений, это ясно, он спрашивает, подходит ли этот формат даты 2015-11-17T00:00:00+0000Z =)   -  person Zilev av    schedule 08.03.2016


Ответы (1)


Нет, не в порядке

Нет, Z является смещением от UTC, поэтому его не следует избыточно комбинировать с числовым смещением +00:00 или +0000.

ИСО 8601

Хотя у меня нет доступа к платной копии спецификации ISO 8601, страница Википедии четко указывает, что Z должно соответствовать времени суток:

…добавьте Z сразу после времени без пробела.

IETF RFC 3339

Свободно доступный RFC 3339, профиль ISO 8601, определяет Z как прикрепленный к время суток:

Суффикс … применяется ко времени …

RFC также указывает с формальной нотацию ABNF, что мы должны использовать < em>либо Z, либо число. В ABNF косая черта (SOLIDUS) означает «или» (исключающее «или»), а пара квадратных скобок означает «необязательно».

time-numoffset = (+/-) время-час [[:] время-минута]

часовой пояс = Z / time-numoffset

Кроме того, раздел 5.4 спецификации конкретно рекомендует против включая избыточную информацию.

Джава

Современные классы java.time, встроенные в Java, используют стандарт ISO 8601. форматы по умолчанию при разборе/генерации строк. См. учебник по Oracle.

Парсинг ввода текста

С Z:

Instant instant = Instant.parse( "2019-01-23T12:34:56.123456789Z" ) ;

С +00:00:

OffsetDateTime odt = OffsetDateTime.parse( "2019-01-23T12:34:56.123456789+00:00" ) ;

Генерация текстового вывода

Чтобы создать строку с Z, просто вызовите Instant::toString.

String output = Instant.now().toString() ;  // Capture the current moment in UTC, then generate text representing that value in standard ISO 8601 using the `Z` offset-indicator.

2019-05-22T21:00:52.214709Z

Чтобы создать строку с 00:00, вызовите OffsetDateTime::format. Сгенерируйте текст, используя DateTimeFormatter с заданным шаблоном форматирования.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSxxx" ) ;
String output = OffsetDateTime.now( ZoneOffset.UTC ).format( f ) ;

2019-05-22T21:00:52.319076+00:00

Усечение

Вы можете обрезать любые микросекунды или наносекунды.

Instant
.now()
.truncatedTo( ChronoUnit.MILLIS )
.toString()

2019-05-22T21:11:28.970Z

…и…

OffsetDateTime
.now( ZoneOffset.UTC )
.truncatedTo( ChronoUnit.MILLIS )
.format( 
    DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSxxx" )
)

2019-05-22T21:11:29.078+00:00

Посмотрите этот код, работающий в реальном времени на IdeOne.com.

person Basil Bourque    schedule 08.03.2016
comment
в Java: final String DATE_FORMAT_ISO_8601 = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; - person Someone Somewhere; 22.05.2019
comment
@SomeoneSomewhere Нет, не прячьте Z внутри пары одинарных кавычек. Это превращает Z в строковый литерал, простое украшение, а не значимый код шаблона. - person Basil Bourque; 22.05.2019
comment
В настоящее время я работаю над проектом крипто-монеты, и спецификация API требует Z в конце вместо +0000. docs.pro.coinbase.com/?javascript#time - person Someone Somewhere; 23.05.2019
comment
@SomeoneSomewhere Хорошо, но это не причина для определения неработающего шаблона форматирования. Z в шаблоне форматирования никогда не должен заключаться в одинарные кавычки. Я отредактирую ответ, чтобы показать простой способ появления Z: Instant.now().toString(). Вы можете обрезать любые микросекунды/наносекунды: Instant.now().truncatedTo( ChronoUnit.MILLIS ).toString() - person Basil Bourque; 23.05.2019