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