如何使用模式來設定日期和時間的格式 (HTML)
[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]
使用 Windows.Globalization.DateTimeFormatting API 搭配自訂模式,以您想要的格式來顯示日期和時間。
Windows.Globalization.DateTimeFormatting 提供不同的方式來適當地設定世界各地語言和地區的日期和時間格式。 在多數情況下,您可以使用標準格式的年、月、日等等。或者,您可以使用字串範本,如 "longdate" 或 "month day",確保得到的 DateTime 格式適用於使用者的文化、語言與地區。 但是在某些狀況下,您可能會想對您要顯示之 DateTime 字串要素的順序與格式擁有多一點控制。這可能是因為您正鎖定特殊的已知文化或地區,或者您想以非標準格式來顯示要素。
基於此目的,您可以使用字串範本參數的特殊語法,稱為"模式"。 模式語法可讓您取得 DateTime 物件的個別要素—例如,只有月份名稱或只有年份值—以便使用您選擇的自訂格式來顯示日期和時間。
您必須知道的事
技術
先決條件
在使用模式時要特別注意,您建立的自訂格式不保證在所有文化中都是有效的。 例如,以 "month day" 範本為例:
var datefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
它會根據目前內容的語言與地區值來建立格式子。因此,一律會以適當的全球格式一起顯示月與日。例如,英文 (美國) 會顯示 "January 1"、法文 (法國) 會顯示 "1 janvier",日文會顯示 "1月1日"。 這是因為該範本是以文化特定模式字串為依據,此字串可以透過模式屬性來存取:
var monthdaypattern = datefmt.patterns;
這會根據格式子的語言和地區產生不同的結果。 請注意,不同語言可能會使用不同的要素、不同的順序,以及包含 (或不含) 其他字元和間距:
En-US: "{month.full} {day.integer}"
Fr-FR: "{day.integer} {month.full}"
Ja-JP: "{month.integer}月{day.integer}日"
您可以使用模式來建構自訂的 DateTimeFormatter,例如這一個是以美國英文模式為依據:
var datefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("{month.full} {day.integer}");
Windows 會針對括弧 {} 內部的個別要素傳回文化特定值。 但若使用模式語法,要素順序不會因文化特性而異。您得到的就是您想要的,而這可能不見得適用每個文化:
En-US: January 1
Fr-FR: janvier 1 (inappropriate for France; non-standard order)
Ja-JP: 1月1 (inappropriate for Japan; the day symbol is missing)
此外,模式不保證會一直保持不變。 各國家或地區可能會改變他們的行事曆系統,因此也會改變格式範本。 Windows 會更新格式子的輸出,以因應這類變更。 因此,您只應該在下列情況使用模式語法來設定 DateTime 的格式:
- 您不需要依靠特定格式的輸出。
- 您不需要讓格式遵守某些文化特定標準。
- 您特別想要讓模式不會因不同文化特性而改變。
- 您想要將模式當地語系化
此處摘述標準字串範本和非標準字串範本的差異:
字串範本,例如 "month day"。
- DateTime 格式的抽象表示包含某種順序的月份值和日期值。
- 確定可以為 Windows 支援的所有語言-地區值傳回有效的標準格式。
- 確定可以為指定的語言-地區提供文化上適當的格式化字串。
- 並非所有要素組合都是有效的。例如,沒有可用於 "dayofweek day" 的字串範本。
字串模式,例如 "{month.full} {day.integer}"。
- 有明確順序的字串,以完整月份名稱後面加上空格,空格後面再加上日期整數的順序表示。
- 可能無法對應任何語言-地區組的有效標準格式。
- 不保證文化上適當。
- 可以指定任何要素組合,且沒有一定的順序。
指示
假設您想要以特定格式顯示目前時間以及目前的月份和日期。 例如,您想要讓美國英文使用者看到類似下列的格式:
June 25 | 1:38 PM
日期部分會對應 "month day" 範本,而時間部分則會對應 "hour minute" 範本。因此,您可以建立串連組成那些範本之模式的自訂格式。
首先,取得相關日期和時間範本的格式子,然後取得這些範本的模式:
// Get formatters for the date part and the time part.
var dtf = Windows.Globalization.DateTimeFormatting;
var mydate = dtf.DateTimeFormatter("month day");
var mytime = dtf.DateTimeFormatter("hour minute");
// Get the patterns from these formatters.
var mydatepattern = mydate.patterns[0];
var mytimepattern = mytime.patterns[0];
您應將自訂格式儲存為可當地語系化的資源字串。 例如,英文 (美國) 字串會是 "{date} | {time}"。 當地語系化人員可視需要調整此字串。例如,如果在某些語言或地區中,時間在日期之前是較自然的樣式,他們就可以變更要素的順序。或者,他們可以使用其他分隔字元來取代 "|"。 在執行階段,使用相關模式來取代字串的 {date} 和 {time} 部分:
// Assemble the custom pattern. This string comes from a resource, and should be localizable.
var mydateplustime = WinJS.Resources.getString("date_plus_time");
mydateplustime = mydateplustime.replace("{date}", mydatepattern);
mydateplustime = mydateplustime.replace("{time}", mytimepattern);
然後您就可以根據自訂模式來建構新的格式子:
// Get the custom formatter.
var mydateplustimefmt = new dtf.DateTimeFormatter(mydateplustime);