簡體   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