Как получить ISO8601-презентацию для даты, используя ICU-строку в javascript?

Есть ли надежный способ печати без костылей? Date внутри строки сообщения ICU, используя формат ISO-8601 - YYYY-MM-DDThh:mm:ss?

Подвопрос 1: поддерживаются ли другие пользовательские строки формата?

Вопрос 2: почему Intl.DateTimeFormat не поддерживает пользовательское форматирование?

Подробности и наблюдения

Я хочу использовать ICU-сообщения для функций i18n для приложения javascript. В NPM есть как минимум два пакета, позволяющих форматировать строки сообщений:

У каждого есть какая-то formatMessageFunction, принимая необработанное ICU-сообщение, название локали и данные для подачи заявки. Но оба используют Intl.DateTimeFormat (похоже, это промышленный стандарт):

и он не может форматировать даты, используя пользовательский формат.

Несмотря на описанные ограничения упомянутых реализаций, ICU описывает способ пользовательского форматирования для дат

пример

Моя ICU-строка:

var icu_string = `Hello,
    <strong>{username}</strong>,
    it is
    <time datetime="{ts, date, ???}">{ts, date}</time>
    `;

Образец кода:

var IntlMessageFormat = require('intl-messageformat'); // no matter, which NPM package to use
var formatter = new IntlMessageFormat(icu_string, 'en');
var output = formatter.format({
    username: 'Barack Obama',
    ts: new Date()
});
console.log(output);

Желаемый вывод Hello, <strong>Barack Obama</strong>, it is <time datetime="2016-10-25T01:01:15Z">Oct 25, 2016</time>

Вы можете проверить текущее поведение здесь: format-message.github.io

Похожие вопросы

  • вопрос по ИСО и СИС. Но я не хочу играть с locale параметр (код будет использовать выбранную локаль для перевода).

2 ответа

Простой обходной путь - передать предварительно отформатированную метку времени. По крайней мере, для временных меток ISO, вы можете передать date.toISOString() в качестве отдельного параметра к сообщению.

var IntlMessageFormat = require('intl-messageformat'); // no matter, which NPM package to use
var icu_string = 'Hello, {username}, it is {ts, date} (ISO-timestamp  is {tsiso})'
var formatter = new IntlMessageFormat(icu_string, 'en');
var date = new Date();
var output = formatter.format({
    username: 'Barack Obama',
    ts: date,
    tsiso: date.toISOString()
});
console.log(output);

И intl-messageformat, и format-message имеют способ определения пользовательского формата, основанного, однако, на параметрах Intl.DateTimeFormat, а не на SimpleDateFormat ICU.

Взгляните на закрытие goog.i18n.DateTimeFormat: https://google.github.io/closure-library/api/goog.i18n.DateTimeFormat.html

Он использует подмножество шаблонов ICU (в приведенной выше ссылке нажмите "VIEW SOURCE" и посмотрите документ из строки 33)

Предупреждение: использование вашего собственного шаблона означает, что вы становитесь ответственными за "правильное понимание", поскольку вы отбрасываете то, что библиотека "знает" о правильном форматировании локали.

Чего ты хочешь добиться, чтобы вещи intl не поддерживали?

Другие вопросы по тегам