如何在javascript中使用ICUstring获取ISO8601-presentation的date?

是否使用ISO-8601格式,在ICU消息string中打印Date方法是一种强健而无拐点的方法 – YYYY-MM-DDThh:mm:ss

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

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

细节和观察

我想使用JavaScript应用程序的i18nfunction的ICU消息 。 NPM上至less有两个软件包,允许格式化消息string:

  • INTL-的MessageFormat
  • 格式的消息

每个都有一些formatMessageFunction ,接受原始的ICU消息,地区的名称和应用的数据。 但两者都使用Intl.DateTimeFormat (看起来,像它是行业标准):

  • 国际消息格式的certificate
  • certificate格式消息

而且它不能使用自定义格式来格式化date。

尽pipe提到的实现有所描述的限制,ICU 描述了一种自定义date格式的方法

我的ICUstring:

 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>

你可以在这里testing当前的行为: format-message.github.io

类似的问题

  • 关于ISO和ICU的问题 。 但我不想玩locale参数(代码将使用选定的语言环境进行翻译)。

一个简单的解决方法是通过预格式化的时间戳。 至less对于ISO时间戳,可以将date.toISOString()作为消息的单独parameter passing。

 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选项来定义自定义格式,而不是ICU的SimpleDateFormat 。

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

它使用ICU模式的一个子集(在上面的链接中单击“查看源”,并参见第33行的文档)

警告:使用自己的模式意味着您必须负责“正确地对待”,因为您丢弃了图书馆“了解”正确的区域设置格式的内容。

你想要达到什么,intl的东西不支持?