使用範本和模式來設定日期和時間的格式
使用 Windows.Globalization.DateTimeFormatting 命名空間中的類別搭配自訂範本和模式,以完全符合您想要的格式來顯示日期和時間。
簡介
DateTimeFormatter 類別提供各種方式,可正確格式化世界各地的語言和區域的日期和時間。 您可以針對年份、月、日等使用標準格式。 或者,您可以將格式範本傳遞至 DateTimeFormatter 建構函式的 formatTemplate 自變數,例如「longdate」或「month day」。
但是,當您想要更多地控制要顯示的 DateTime 物件的元件的順序和格式時,可以將格式模式傳遞給建構函式的 formatTemplate 參數。 格式模式會使用特殊語法,可讓您取得 DateTime 物件的個別元件,例如月名,或只取得年份值,以便以您選擇的任何自訂格式顯示它們。 此外,模式可以當地語系化以適應其他語言和區域。
注意這只是格式模式的概述。 有關格式範本和格式模式的更完整討論,請參閱 DateTimeFormatter 類別的備註部分。
格式範本和格式模式之間的差異
格式範本是與區域性無關的格式字串。 因此,如果您使用格式範本建構 DateTimeFormatter,則格式器會以目前語言的正確順序顯示您的格式元件。 相反,格式模式是特定於文化的。 如果您使用格式模式建構 DateTimeFormatter,則格式器會使用完全相同的模式。 因此,模式不一定跨文化特性有效。
讓我們用一個例子來說明這種差異。 我們將向 DateTimeFormatter 建構函式傳遞一個簡單的格式範本 (不是模式)。 這是範本「month day」的格式。
var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
這會根據目前內容的語言和區域值來建立格式器。 格式範本中組件的順序並不重要;格式化程式以目前語言的正確順序顯示它們。 因此,英語 (美國) 顯示「January 1」,法語 (法國) 顯示「1 janvier」,日文顯示「1 月 1 日」。
另一方面,格式模式是特定文化特性。 讓我們存取格式範本的格式模式。
IReadOnlyList<string> monthDayPatterns = dateFormatter.Patterns;
根據執行時語言和區域的不同,這會產生不同的結果。 不同的區域可能以不同的順序使用不同的組件,有或沒有額外的字元和間距。
En-US: "{month.full} {day.integer}"
Fr-FR: "{day.integer} {month.full}"
Ja-JP: "{month.integer}月{day.integer}日"
在上述範例中,我們輸入了與文化特性無關的格式字串,而我們得到了特定文化特性的格式字串 (這是我們呼叫 dateFormatter.Patterns
時所發生之語言和區域的功能)。 因此,如果您從特定文化特性格式模式建構 DateTimeFormatter,則它只適用於特定語言/區域。
var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("{month.full} {day.integer}");
上面的格式化程式傳回括號 {} 內各個元件的區域性特定值。 但是,格式模式中的元件順序是不變的。 你得到的正是你所要求的,這可能適合也可能不適合文化。 此格式化程序對英語 (美國) 有效,但不適用於法語 (法國) 或日語。
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 格式的抽象表示,包括任意順序的月、日等值。
- 保證在 Windows 支援的所有語言區域值中傳回有效的標準格式。
- 保證為您提供適合給定語言區域的文化上合適的格式字串。
- 並非所有組件的組合都有效。 例如,「dayofweek day」無效。
格式模式,例如「{month.full} {day.integer}」
- 明確排序的字串,表示完整的月份名稱,後面跟著空格,後面跟著日期整數,按該順序或您指定的任何特定格式模式。
- 可能不符合任何語言區域對的有效標準格式。
- 不保證適合文化。
- 可以以任何順序指定組件的任何組合。
範例
假設您希望以特定格式顯示目前月份和日期以及目前時間。 例如,您希望美國英語用戶看到以下內容:
June 25 | 1:38 PM
日期部分會對應至「月日」格式範本,而時間部分則對應至「小時分鐘」格式範本。 因此,您可以為相關日期和時間格式範本建構格式化程序,然後使用可本地化的格式字串將它們的輸出連接在一起。
var dateToFormat = System.DateTime.Now;
var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
var timeFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("hour minute");
var date = dateFormatter.Format(dateToFormat);
var time = timeFormatter.Format(dateToFormat);
string output = string.Format(resourceLoader.GetString("CustomDateTimeFormatString"), date, time);
CustomDateTimeFormatString
是指資源檔案 (.resw) 中可在地化資源的資源識別碼。 對於預設語言英語 (美國),這將被設定為值「{0} | {1}」以及指示「{0}」是日期和「{1}」是時間的註釋。 如此一來,翻譯工具就可以視需要調整格式專案。 例如,如果某些語言或區域似乎更自然,在日期之前的時間,他們可以變更項目的順序。 或者,它們可以將「|」取代為其他分隔符。
實現此範例的另一種方法是查詢兩個格式化程式的格式模式,將它們連接在一起,然後根據產生的格式模式建構第三個格式化程式。
var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
var timeFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("hour minute");
string dateFormatterPattern = dateFormatter.Patterns[0];
string timeFormatterPattern = timeFormatter.Patterns[0];
string pattern = string.Format(resourceLoader.GetString("CustomDateTimeFormatString"), dateFormatterPattern, timeFormatterPattern);
var patternFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter(pattern);
string output = patternFormatter.Format(System.DateTime.Now);