Является ли символ T обязательным в дате ISO 8601?

Мне интересно, соответствует ли следующая дата ISO8601:

2012-03-02 14:57:05.456+0500

(конечно, 2012-03-02T14:57:05.456+0500 совместимо, но не настолько понятно для человека!) IOW, является ли T между датой и временем обязательным?


person SCO    schedule 02.03.2012    source источник
comment
Стандарт ISO абсурден с точки зрения удобочитаемости. Подчеркивание (низкое тире), _, было бы намного лучше, чем T: 2012-03-02_14:57:05.456+0500   -  person Rodolfo    schedule 16.12.2019


Ответы (2)


Это необходимо, если только «партнеры по обмену информацией» не согласятся его опустить.

Цитируя стандарт ISO 8601, раздел 4.3.2:

Символ [T] должен использоваться в качестве указателя времени для указания начала представления компонента времени суток в этих выражениях. [...]

ПРИМЕЧАНИЕ По взаимному согласию партнеров по обмену информацией символ [T] может быть опущен в приложениях, где нет риска путаницы представления даты и времени суток с другими, определенными в настоящем стандарте.

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

ОБНОВЛЕНИЕ. В комментарии Марка Амери хорошо сказано, что разрешение опустить [T] не обязательно означает разрешение заменить его пробелом. Итак, это:

2012-03-02T14:57:05.456+0500

явно соответствует, и это:

2012-03-0214:57:05.456+0500

разрешено, если партнеры соглашаются опустить [T], но это:

2012-03-02 14:57:05.456+0500

по-видимому, это не так (хотя это гораздо более читабельно, чем версия с просто опущенной [T]).

Лично, если бы требовалось соответствие ISO 8601, я бы включил [T], а если бы это было не так, я бы использовал пробел (или дефис, если он будет частью имени файла). Мое предположение, и это не более того, заключалось в том, что намерение состояло в том, чтобы разрешить замену буквы «Т» пробелом, но стандарт этого не говорит.

См. также RFC 3339, раздел 5.6, упомянутый в ответ Чарльза Бернса.

person Keith Thompson    schedule 02.03.2012

Эта дата не соответствует ISO-8601, как указал Кит Томпсон, но она совместима с RFC 3339, профилем ISO 8601. Вроде того. См. ПРИМЕЧАНИЕ внизу следующего текста из RFC 3339:

date-time       = full-date "T" full-time

  NOTE: Per [ABNF] and ISO8601, the "T" and "Z" characters in this
  syntax may alternatively be lower case "t" or "z" respectively.

  This date/time format may be used in some environments or contexts
  that distinguish between the upper- and lower-case letters 'A'-'Z'
  and 'a'-'z' (e.g. XML).  Specifications that use this format in
  such environments MAY further limit the date/time syntax so that
  the letters 'T' and 'Z' used in the date/time syntax must always
  be upper case.  Applications that generate this format SHOULD use
  upper case letters.

  NOTE: ISO 8601 defines date and time separated by "T".
  Applications using this syntax may choose, for the sake of
  readability, to specify a full-date and full-time separated by
  (say) a space character.
person Charles Burns    schedule 30.11.2015
comment
Тот факт, что RFC 3339 разрешает это, довольно абсурден; похоже, что намерение авторов RFC 3339 состояло в том, чтобы создать строго более строгий стандарт, чем ISO 8601, при этом гарантируя, что все даты и время RFC 3339 по-прежнему будут соответствовать грамматике ISO 8601... но затем они случайно решили торпедировать этой цели, сделав грамматику RFC 3339 более разрешительной, чем грамматика ISO 8601, одним крошечным и бессмысленным способом. я не понимаю; для меня это настолько явно глупое решение, что я не могу понять, как оно было принято. Но это было, нравится мне это или нет, и поэтому этот ответ, к сожалению, правильный. - person Mark Amery; 03.07.2018
comment
Я не думаю, что ПРИМЕЧАНИЕ смягчает грамматику даты и времени, а скорее указывает, что протоколы не должны использовать дату и время, если они предпочитают использовать полную дату и полное время отдельно. Например, вместо того, чтобы определять что-то вроде timestamp_header ::= "Timestamp:" date-time, протокол может определить его как timestamp_header ::= "Timestamp:" full-date " " full-time. - person Adam M. Costello; 15.01.2019