如何在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的东西不支持?