繁体   English   中英

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

[英]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

类似的问题

一个简单的解决方法是传入预格式化的时间戳。 至少对于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

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

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

警告:使用您自己的模式意味着您有责任“正确”,因为您丢弃了库“知道”正确的区域设置格式的东西。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM