[英]How to get ISO8601-presentation for date using ICU-string in javascript?
是否有一种强大且无拐杖的方式在ICU消息字符串中打印Date
,使用ISO-8601格式 - YYYY-MM-DDThh:mm:ss
?
子问题1 :是否支持其他自定义格式字符串?
子问题2 :为什么Intl.DateTimeFormat不支持自定义格式?
我想为javascript应用程序使用ICU消息来实现i18n功能。 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
参数(代码将使用所选的语言环境进行翻译)。 一个简单的解决方法是传入预格式化的时间戳。 至少对于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选项而不是ICU的SimpleDateFormat 。
看看闭包,goog.i18n.DateTimeFormat: https ://google.github.io/closure-library/api/goog.i18n.DateTimeFormat.html
它使用ICU模式的一个子集(在上面的链接中单击“查看源”,并查看第33行的文档)
警告:使用您自己的模式意味着您有责任“正确”,因为您丢弃了库“知道”正确的区域设置格式的东西。
你想要实现的东西是什么东西不支持?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.