[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]
使用 Windows.Globalization.DateTimeFormatting API 和自定义模式严格按照所需模式显示日期和时间。
Windows.Globalization.DateTimeFormatting 为全球的语言和区域提供了各种正确设置日期和时间格式的方法。 在大多数情况下,你可以对年、月、日等使用标准格式。或者,你也可以使用标准字符串模板,例如 "longdate" 或 "month day",以确保生成的 DateTime 格式适合用户的文化、语言和区域。 但是,在某些情况下,你可能希望对要显示的 DateTime 字符串要素的顺序和格式有更多控制权。这可能是因为你针对的是某个特定的已知文化或区域,也可能因为你希望以非标准的格式显示要素。
为此,你可以使用一种针对字符串模板参数的特殊语法,称为 "pattern"(模式)。 使用模式语法可以获得 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);