如何在javascript中使用ICU-string获取ISO8601演示日期?

时间:2016-10-25 02:31:48

标签: javascript node.js internationalization icu intl

使用ICU-message格式 - YYYY-MM-DDThh:mm:ss,是否有一种强大且无拐杖的方式在ISO-8601字符串中打印formatMessageFunction

子问题1 :是否支持其他自定义格式字符串?

Subquestion 2 :为什么Intl.DateTimeFormat不支持自定义格式?

详情及意见

我想将ICU-messages用于javascript应用程序的i18n功能。 NPM上至少有两个包,允许格式化消息字符串:

每个都有某种var icu_string = `Hello, <strong>{username}</strong>, it is <time datetime="{ts, date, ???}">{ts, date}</time> `; ,接受原始ICU消息,区域设置名称和应用数据。但两者都使用Intl.DateTimeFormat(看起来像是行业标准):

并且无法使用自定义格式设置日期格式。

尽管所述实施方案存在上述限制,但ICU describes a way of custom formatting for dates

实施例

我的ICU字符串:

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>

理想的输出是locale

  

您可以在此处测试当前行为:format-message.github.io

类似问题

  • question about ISO and ICU。但我不想使用$a = true; $b = false; $c = true; $d = false; $e = false; $booleanVariables = [ $a, $b, $c, $d, $e ]; $count = 0; foreach ($booleanVariables as $variable) { if ($variable) { $count++; // Do something here } } echo $count; 参数(代码将使用所选的语言环境进行翻译)。

2 个答案:

答案 0 :(得分:1)

一个简单的解决方法是传入预格式化的时间戳。至少对于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-messageformatformat-message都可以根据Intl.DateTimeFormat选项定义自定义格式,而不是ICU的SimpleDateFormat

答案 1 :(得分:0)

看看闭包,goog.i18n.DateTimeFormat: https://google.github.io/closure-library/api/goog.i18n.DateTimeFormat.html

它使用ICU模式的一个子集(在上面的链接点击&#34;查看源&#34;,并查看第33行的文档)

警告:使用您自己的模式意味着您应该对#14;正确的事情负责,因为您丢弃了图书馆所知道的东西&#34;关于正确的区域设置格式。

你想要实现的目标是什么东西不支持?