Получить ISO 8601 с помощью Intl.DateTimeFormat

Я хочу использовать Intl.DateTimeFormat для форматирования даты, а в примерах -

// when requesting a language that may not be supported, such as
// Balinese, include a fallback language, in this case Indonesian

Отлично, поэтому я хочу, чтобы мой отказ был ISO 8601 в том случае, если язык не существует

// i.e. the same as/similar to
new Date().toISOString(); // "2014-07-31T02:42:06.702Z"

Однако

//  Intl.DateTimeFormat([locales [, options]])
var o = {};
o.year = o.month = o.day = o.hour = o.minute = o.second = 'numeric';
new Intl.DateTimeFormat(['foo', 'iso8601'], o);
// RangeError: Invalid language tag: iso8601

Это похоже на то, что iso8601 не является частью

locales Строка с тегом языка BCP 47 или массив таких строк.

Я также попытался использовать тот, который я знаю, работает, например. en-GB с суффиксом u-ca-iso8601, но это не дает никакого другого результата без суффикса

var f = new Intl.DateTimeFormat(['foo', 'en-GB-u-ca-iso8601'], o);
f.format(new Date());
// 31/7/2014 03:35:26

Почему это не работает? Есть ли даже locale, который даст мне результат, который я ищу?


Я бы предпочел не писать сложную оболочку, например,

if (Intl.DateTimeFormat.supportedLocalesOf(['foo']).length === 0)

Ответ 1

Так как не существует способа настроить определения локалей в Intl, вам нужно будет найти локаль, которая использует формат ISO 8601. Проверка определений CLDR для формата yMd в Диаграмма по типу: Дата и время: по-григориански, я нашел некоторые, которые напоминают ISO 8601. Однако, поддержка определенных локалей в браузерах или других реализациях JavaScript не гарантируется.

На практике, среди таких локалей в CLDR, fo (Faroese), кажется, ближе всего к ISO 8601 и поддерживается браузерами. Тестирование с помощью Intl.DateTimeFormat(['foo', 'iso8601'], o) дает следующие результаты:

2014-7-31 10:26:50      in Chrome
2014-07-31 10:26:50     in Firefox and IE

Таким образом, Chrome не совсем применил правильный формат (как CLDR), и все эти браузеры используют пробел, а не T в качестве разделителя. Тем не менее, пространство делает презентацию более читаемой, и теперь она считается альтернативной в соответствии с действующим ISO 8601, а именно ISO 8601: 2004, в котором говорится:

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

Однако, кажется более безопасным использовать обертку, как в вопросе; его не слишком сложно, по сравнению с рисками и неуклюжим характером использования некоторых выбранных локалей. (Даже если fo поддерживается всеми реализациями, нет никакой гарантии, что власти Фарерских островов не решат изменить определение локали.)