Как получить 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 не поддерживали?