金沙棋牌官方平台

当前位置:金沙棋牌 > 金沙棋牌官方平台 > 命名空间金沙棋牌官方平台,JavaScript面对国际化

命名空间金沙棋牌官方平台,JavaScript面对国际化

来源:http://www.logblo.com 作者:金沙棋牌 时间:2019-08-29 15:55

JavaScript面对国际化编程时的一些建议

   这篇文章主要介绍了JavaScript面对国际化编程时的一些建议,包括时区与语言编码等一些值得注意的问题,需要的朋友可以参考下

  什么是国际化?

  国际化(Internationalization的缩写是i18n——i,中间18个字符,n)是将软件处理的能让来自各种地方使用各种语言的用户更简单使用的一个过程。假定某个用户来自某个地方说某种语言,他可能不经意间就得到一些错误提示。尤其是你甚至都没有做这种假设。

  ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

function formatDate(d)

{

// Everyone uses month/date/year...right?

var month = d.getMonth() 1;

var date = d.getDate();

var year = d.getFullYear();

return month "/" date "/" year;

}

 

function formatMoney(amount)

{

// All money is dollars with two fractional digits...right?

return "$" amount.toFixed(2);

}

 

function sortNames(names)

{

function sortAlphabetically(a, b)

{

var left = a.toLowerCase(), right = b.toLowerCase();

if (left > right)

return 1;

if (left === right)

return 0;

return -1;

}

 

// Names always sort alphabetically...right?

names.sort(sortAlphabetically);

}

  JavaScript过去的i18n支持太糟糕

  传统JS的i18n程序使用toLocaleString()方法进行格式化。结果字符串包含实现自身提供的所有细节:没有办法自己选择(你确实需要那种date格式的weekday吗?year是无关紧要的吗?)。即使包含对应的细节,格式也可能是错的,比如本期望是百分比但得到的是数字。而且你还不能选择一个区域设置(locale)。

  对于排序,JS提供了基本没用的基于区域设置(locale-sensitive)的文本比较函数。localeCompare()确实存在,但是其接口根本不适合sort。而且还不允许选择区域设置,或者排序方式。

  这些限制太糟了(当我认识到时,我非常吃惊!),因为需要i18n支持(通常是金融站点用于显示货币)的严谨web应用会把数据打包,发给服务器,服务器进行操作,然后发回客户端。数据往返服务器仅仅为了处理货币的数量。Yeesh。

  新的JS国际化API

  新的ECMAScript国际化API大大提升了JS的i18n能力。 它提供了大家所能想到的格式化date、数字,文本排序的方式。区域设置是可选的,如果请求的区域设置不支持可以回退。格式化请求可以指定具体要包含的组件。支持自定义的百分比、有效数字、货币格式。开放了大量排序选项用于文本排序。如果你关心性能,首要的操作是选择一个区域设置,然后处理选项参数,现在这个操作只会处理一次,而不是之前每次区域设置相关的操作执行时都会被执行一遍。

  这不是说,这个API是万能药,而仅仅是"尽最大努力"。精确的输出几乎总是故意不指定的。一份实现可以仅支持 oj 区域设置(合法的),也可以忽略(几乎全部)提供的格式化选项。大多数实现都包含高质量的多区域支持,但并不保证有(尤其是资源限定的系统,如手机)。

  在底层,Firefox的实现依赖于Unicode 的国际化组件库(ICU) ,这个库又依赖 Unicode Common 区域数据仓库(CLDR)的区域数据集。我们的实现是自托管的:ICU之上的大部分实现用JS写的。在这个过程中,我们遇到了一些问题(我们从未如此大规模的自托管过),但基本上都不大。

  Intl 接口(不是数字1,是字母l)

  i18n 存在于 Intl 对象之上。Intl 包含3个构造函数:Intl.Collator, Intl.DateTimeFormat, 和Intl.NumberFormat。每个构造函数创建一个对象,这个对象提供相关操作、高效地为这些操作缓存区域设置和选项。按以下方式创建对象:

  ?

1

2

var ctor = "Collator"; // 或其他

var instance = new Intl[ctor](locales, options);

  locales 是个字符串,指定单个语言标签,或者包含多个语言标签的类数组对象。语言标签如下面的字符串:en(普通英语),de-AT(奥地利德语),zh-Hant-TW(台湾使用的繁体中文)。语言标签可以包含一个“Unicode扩展”,形式为-u-key1-value1-key2-value2..., 其中每个key是“扩展key”。不同的构造函数对此进行具体解释。

  opions 是个对象,其属性(如果不存在,就赋值为undefined)决定格式化器(formatter)和整理器(collator)的行为。精确的解释由构造函数决定。

  给定区域信息和选项,实现会尝试生成近似理想行为的最接近行为。Firefox 支持用于整理(collation)的400 区域,用于date/time和数字格式化的600 区域,所以很可能(但不保证)你想要的区域是被支持的。

  Intl 通常不保证某些特定行为。如果请求的区域不被支持,Intl 允诺“尽最大努力”的行为。即使区域是被支持的,行为也不是严格指定的。永远不要假设特定的选项集适用于某个特定格式。(围绕请求的组件)总体格式的用语可能因浏览器甚至浏览器的版本而不同。单个组件的格式是未指定的:weekday的短格式可以为“S”, “Sa”, 或“Sat”。Intl API并不用于公开精确的特定行为。

  选项

金沙棋牌官方平台,  date/time格式化的主要选项属性如下:

  weekday, era

  "narrow", "short", or "long". (era通常指历法系统中长于一年的分段,如现行日皇统治, 或者其他纪年法)

  month

  "2-digit", "numeric", "narrow", "short", or "long"

  year

  day

  hour, minute, second

  "2-digit" or "numeric"

  timeZoneName

  "short" or "long"

  timeZone

  区分大小写的"UTC"通过对应的toUTC进行格式化。有些值如"CEST"和"America/New_York"不是必须被支持的,它们确实在当前Firefox下没有效果。

  这些值并不映射到特定格式:记住Intl API几乎不指定精确的行为。Intl的目的,举例来说是"narrow", "short", 和"long"生成对应大小的“S”/“Sa”, “Sat”, 和“Saturday”(输出可能不太准确,因为Saturday和Sunday都可以生成“S”)。 "2-digit"和"numeric"映射到2位数字的字符串或者全长度的数字字符串,如“70”和“1970”。

  最终使用的选项大部分是请求的选项。但是,如果你不指定请求的 weekday/year/month/day/hour/minute/second,那么 year/month/day 将会被加入到你提供的选项。

  除此之外,还有些特殊的选项:

  hour12

  指定hour采用12小时还是24小时格式。默认通常是依赖于区域设置的(某些细节,如午夜是0点,还是12点,以及是否存在前导0,都是依赖于区域设置的)。

  还有另外2种特殊属性,localeMatcher (可选"lookup"或"best fit") 和formatMatcher (可选"basic"或"best fit"),两者默认值都是"best fit"。这些会影响正确的区域设置和格式的选取。它们的用例可能比较难懂,就不赘述了。

  区域设置相关选项

  DateTimeFormat也允许通过自定义历法和数字系统来格式化。具体细节存在于区域设置,所以它们可以在语言标签的Unicode扩展中找到。

  例如,泰国的泰语中语言标签为th-TH。回一下Unicode扩展的格式-u-key1-value1-key2-value2.... 历法系统的key是ca, 数字系统的key时nu。泰语数字系统值为thai,中文历法系统值为chinese。因此用大体这样的方式来格式化date,我们把包含这些key/value对的Unicode追加到语言标签上去:th-TH-u-ca-chinese-nu-thai。

  关于更多历法和数字系统的信息,查看DateTimeFormat的完整文档。

  举例

  创建DateTimeFormat对象后,下一步是通过方便的format()函数来格式化date。更方便的是,这个函数是有界函数(bound function):你不必在DateTimeFormat上直接调用。之后给它传递一个时间戳或者Date对象。

  总结一下,下文是如何为特定用途创建DateTimeFormat选项的例子(在当前Firefox执行行为下)。

  ?

1

2

3

4

var msPerDay = 24 * 60 * 60 * 1000;

 

// July 17, 2014 00:00:00 UTC.

var july172014 = new Date(msPerDay * (44 * 365 11 197));

  我们来格式化美国英语的date。我们先创建一个2位数字的month/day/year, 加上2位数字的hours/minutes, 还有一个短时区来确定这个时间。(结果肯定因不同时区而明显不同)

  ?

1

2

3

4

5

6

7

8

var options =

{ year: "2-digit", month: "2-digit", day: "2-digit",

hour: "2-digit", minute: "2-digit",

timeZoneName: "short" };

var americanDateTime =

new Intl.DateTimeFormat("en-US", options).format;

 

print(americanDateTime(july172014)); // 07/16/14, 5:00 PM PDT

  或者类似的,对葡萄牙语,最好是巴西使用的葡语,但是用在葡萄牙作品中的。格式会稍长,因为包含完整的year和正式拼写的month,但是因移植性要转成UTC格式。

  ?

1

2

3

4

5

6

7

8

9

var options =

{ year: "numeric", month: "long", day: "numeric",

hour: "2-digit", minute: "2-digit",

timeZoneName: "short", timeZone: "UTC" };

var portugueseTime =

new Intl.DateTimeFormat(["pt-BR", "pt-PT"], options);

 

// 17 de julho de 2014 00:00 GMT

print(portugueseTime.format(july172014));

  那对于一个压缩的,UTC格式的瑞士火车每周调度表?我们尝试用正式语言按流行度从大到小来选择最易读的一个。

  ?

1

2

3

4

5

6

7

8

var swissLocales = ["de-CH", "fr-CH", "it-CH", "rm-CH"];var options =

{ weekday: "short",

hour: "numeric", minute: "numeric",

timeZone: "UTC", timeZoneName: "short" };

var swissTime =

new Intl.DateTimeFormat(swissLocales, options).format;

 

print(swissTime(july172014)); // Do. 00:00 GMT

  或者我们尝试某个日本博物馆里的一幅画中的描述性文本中的date,这个date使用日本的year和era历法。

  ?

1

2

3

4

5

var jpYearEra =

new Intl.DateTimeFormat("ja-JP-u-ca-japanese",

{ year: "numeric", era: "long" });

 

print(jpYearEra.format(july172014)); // 平成26年

  对一些完全不同的、更长的date,用于泰国泰语,但是使用泰语数字系统和中国历法。(类似Firefox的高质量实现通常会将普通的th-TH当做th-TH-u-ca-buddhist-nu-latn, 因为泰国使用佛历系统和拉丁0-9数字)。

  ?

1

2

3

4

5

6

var options =

{ year: "numeric", month: "long", day: "numeric" };

var thaiDate =

new Intl.DateTimeFormat("th-TH-u-nu-thai-ca-chinese", options);

 

print(thaiDate.format(july172014)); // ?? 6 ??

  撇开历法和数字系统,还是很简单的。只要选取自己的组件和长度。

  选项

  数字格式化的主要选项属性有:

  style

  "currency", "percent", or "decimal" (默认值).

  currency

  3字母货币代码,如USD、CHF。需要style是"currency", 不然没有意义

  currencyDisplay

  "code", "symbol", or "name", 默认为"symbol". "code"使用格式字符串的3字母货币代码。"symbol"使用货币符号,如$或£。"name"通常使用某些正式拼写版本的货币。(Firefox 目前仅支持"symbol", 这个问题不就就修复)

  minimumIntegerDigits

  范围1到21(包含)的整数,默认为1。结果字符串的整数部分如果没有这么长,它前面会用0来填充。 (若这个值为2,那么3的格式化形式为“03”。)

  minimumFractionDigits, maximumFractionDigits

  0-20(包含)的整数。结果字符串至少minimumFractionDigits, 至多maximumFractionDigits个有效数字。如果style是"currency",默认最小值跟货币有关(通常是2,很少0或者3),不然就是0。默认最大值,百分比是0,数字是3,货币的最大值跟货币有关。

  minimumSignificantDigits, maximumSignificantDigits

  1-21(包含)的整数。如果有,它们将会覆盖上文关于整数/分数的对数字的控制,而由它们以及数字的要求长度,共同确定格式化的数字字符串中最小/最大有效数字的值。 (注意对10的倍数,有效数字可能不准确,如100,它的1,2,3位有效数字。)

  useGrouping

  布尔值(默认true)决定格式化字符串是否包含分组分隔符(如,英语的千分隔符“,”)。

  NumberFormat还识别难懂的、大多数可忽略的localeMatcher属性。

  区域化选项

  在Unicode扩展中,使用nu关键字可以使DateTimeFormat支持自定义数字系统,NumberFormat也是这样。 例如,在中国,中文的语言标签是zh-CN。 汉语十进制数字系统对应的值是hanidec。 为了格式化这些系统的数字,我们在这些语言标签上添加一些Unicode扩展:zh-CN-u-nu-hanidec。

  关于不同数字系统标识的完整信息,见NumberFormat详细说明文档。

  示例

  NumberFormat对象有一个 format方法,这一点和 DateTimeFormat相同。 format方法是一个有界函数,它有时可以独立于 NumberFormat使用。

  下面是在当前Firefox环境下为特定用途创建NumberFormat选项的例子。首先,我们来格式化中国大陆中文的货币格式,特别是使用汉字数字(而不是更普遍的拉丁数字)。选择"currency" style, 然后使用renminbi(yuan)的货币代码,数字分组默认,小数部分数字采用通常做法。

  ?

1

2

3

4

var tibetanRMBInChina =

new Intl.NumberFormat("zh-CN-u-nu-hanidec",

{ style: "currency", currency: "CNY" });

print(tibetanRMBInChina.format(1314.25)); // ¥ 一,三一四.二五

  或者我们来格式化美国的天然气价格,千分位有个古怪的9,用在美国英语中。

  ?

1

2

3

4

5

var gasPrice =

new Intl.NumberFormat("en-US",

{ style: "currency", currency: "USD",

minimumFractionDigits: 3 });

print(gasPrice.format(5.259)); // $5.259

  或者我们尝试埃及的阿拉伯语中的百分比。确定百分比有至少2个有效数字。(注意这个以及其他RTL例子可能在RTL上下文出现的顺序不一样,如?????? 而不是??????,RTL/right to left,从右到左的)

  ?

1

2

3

4

5

var arabicPercent =

new Intl.NumberFormat("ar-EG",

{ style: "percent",

minimumFractionDigits: 2 }).format;

print(arabicPercent(0.438)); // ??????

  或者假设我们格式化阿富汗波斯语,我们期望至少2位的整数部分,至多2位的小数部分。

  ?

1

2

3

4

5

var persianDecimal =

new Intl.NumberFormat("fa-AF",

{ minimumIntegerDigits: 2,

maximumFractionDigits: 2 });

print(persianDecimal.format(3.1416)); // ?????

  最后,我们格式化巴林的阿拉伯语中的巴林第纳尔的数量。不同于大部分货币,巴林第纳尔等于1000费尔,因此我们需要三位小数位。(再次注意,不要太过相信表面的阅读顺序)?

  ?

1

2

3

4

var bahrainiDinars =

new Intl.NumberFormat("ar-BH",

{ style: "currency", currency: "BHD" });

print(bahrainiDinars.format(3.17)); // ?.?.? ?????

  整理

  选项

  下面是整理的主要选项属性:

  usage

  "sort" or "search" (默认"sort"), 指定整理器(collator)的目的。(查找整理器可能比排序整理器更多考虑字符串是否相等。)

  sensitivity/敏感性

  "base", "accent", "case", or "variant"。这个选项影响整理器对基本字符相同但是重音/变音不同的字符的敏感性。(基本字符与区域设置有关:“a”和“?”在德语中基本字符相同,但是瑞典语中是不同的。) "base"敏感性只考虑基本字符,忽略各种变体(如德语中“a”, “A”,和“?”被认为是相同的)。 "accent"敏感性考虑基本字符和重音,但是忽略大小写(如德语中的“a和“A”是相同的,“?”与两者不同)。"case"考虑基本字符和大小写,而忽略重音(如德语中的“a”和“?”相同,而与“A”不同)。"variant"考虑基本字符、重音、大小写(如德语的“a”, “?”和“A”均不同)。如果usage是"sort",默认"variant"; 否则与区域设置有关。

  numeric

  默认false的布尔值,决定字符串中的数字是否被当做数字参与比较。如当做数字的排序结果可能是"F-4 Phantom II", "F-14 Tomcat", "F-35 Lightning II"; 不当做数字的结果"F-14 Tomcat", "F-35 Lightning II", "F-4 Phantom II".

  caseFirst

  "upper", "lower", or "false" (默认)。决定比较时是否考虑大小写:"upper"把大写放在前面("B", "a", "c"), "lower"把小写放前面("a", "c", "B"), "false"完全忽略大小写("a", "B", "c")。 (注意,目前Firefox完全忽略这个属性)

  ignorePunctuation

  默认false的布尔值。决定比较时是否忽略标点(如"biweekly"和"bi-weekly"是否相等)。

  localeMatcher属性你可以忽略了。

  区域相关选项

  区域的Unicode扩展部分指定的整理器主要选项是co,它选择排序操作的方式:电话本(phonebk), 字典 (dict), 还有其他。

  另外,kn和kf这两个key可以选择拷贝选项对象的numeric和caseFirst属性。但是并不保证可用于语言标签,而且选项比语言标签的组件更清晰。所以最好在选项内部进行调整。

  key-value对(paris)嵌入到Unicode的方式跟DateTimeFormat和NumberFormat相同; 想知道如何在语言标签中指定它们,可以查看对应的章节。

  举例

  整理器Collator对象有个比较函数属性。这个函数接受2个参数x和y, 如果x

  我们尝试来给德国德语的姓氏进行排序。德语中实际上有2种排序方式,电话本和字典。电话本排序强调读音,比如“?”, “?”等近似被扩展成“ae”, “oe”等。

  ?

1

2

3

4

5

6

7

var names =

["Hochberg", "H?nigswald", "Holzman"];

var germanPhonebook = new Intl.Collator("de-DE-u-co-phonebk");

 

//就像对["Hochberg", "Hoenigswald", "Holzman"]排序

// Hochberg, H?nigswald, Holzman

print(names.sort(germanPhonebook.compare).join(", "));

  有些德语单词使用变音符进行词形变化,所以在字典中排序会忽略变音符(除了两个单词仅仅变音符不同:schon,sch?n)。

  ?

1

2

3

4

5

var germanDictionary = new Intl.Collator("de-DE-u-co-dict");

 

//就像对["Hochberg", "Hoenigswald", "Holzman"]排序

// Hochberg, H?nigswald, Holzman

print(names.sort(germanDictionary.compare).join(", "));

  或者我们来对美国英语的Firefox的版本进行排序,这些字符串故意打错(大小写不同,随机重音,变音标记,额外的连字符)。我们希望根据版本号进行排序,所以要做numeric排序,这样字符串中的数字才会作为数字参与比较,而不是逐字符的。

  ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

var firefoxen =

["FireF?x 3.6",

"Fire-fox 1.0",

"Firefox 29",

"Fírefox 3.5",

"Fírefox 18"];

var usVersion =

new Intl.Collator("en-US",

{ sensitivity: "base",

numeric: true,

ignorePunctuation: true });

 

// Fire-fox 1.0, Fírefox 3.5, FireF?x 3.6, Fírefox 18, Firefox 29

print(firefoxen.sort(usVersion.compare).join(", "));

  最后,我们来做跟区域有关的字符串查找,查找忽略大小写和重音,并用于美国英语。

  ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

// Comparisons work with both composed and decomposed forms.

var decoratedBrowsers =

[

"Au0362maya", // A?maya

"CHu035Br?me", // CH?r?me

"Firefóx",

"sAfàri",

"ou0323pERA", // ?pERA

"Iu0352E", // I?E

];

var fuzzySearch =

new Intl.Collator("en-US",

{ usage: "search", sensitivity: "base" });

function findBrowser(browser)

{

function cmp(other)

{

return fuzzySearch.compare(browser, other) === 0;

}

return cmp;

}

print(decoratedBrowsers.findIndex(findBrowser("Firêfox"))); // 2

print(decoratedBrowsers.findIndex(findBrowser("Saf?ri"))); // 3

print(decoratedBrowsers.findIndex(findBrowser("?maya"))); // 0

print(decoratedBrowsers.findIndex(findBrowser("?pera"))); // 4

print(decoratedBrowsers.findIndex(findBrowser("Chromè"))); // 1

print(decoratedBrowsers.findIndex(findBrowser("I?"))); // 5

  琐碎

  检测某个操作是否支持特定区域,或者一个区域是否被支持,会很有用。Intl在每个构造函数上都提供了supportedLocales()函数,在每个原型上提供了resolvedOptions()函数来公开这些信息。

  ?

1

2

3

4

5

6

7

8

9

10

var navajoLocales =

Intl.Collator.supportedLocalesOf(["nv"], { usage: "sort" });

print(navajoLocales.length > 0

? "Navajo collation supported"

: "Navajo collation not supported");

var germanFakeRegion =

new Intl.DateTimeFormat("de-XX", { timeZone: "UTC" });

var usedOptions = germanFakeRegion.resolvedOptions();

print(usedOptions.locale); // de

print(usedOptions.timeZone); // UTC

  遗留行为

  ES5的toLocaleString和localeCompar函数之前没有特定语义,不接受特定选项,基本上没有任何用处。因此i18n API根据Intl操作重组了它们。现在每个方法都接受附加的尾随locales和options参数,它们会像Intl构造函数一样被解释。(除了toLocaleTimeString 和 toLocaleDateString, 如果options没有,它们就会使用不同的默认组件)

  对并不关心精确行为的简单应用,这没关系,老方法也可以用。但是如果需要更多控制或者多次格式化、比较的话,最好直接使用Intl。

这篇文章主要介绍了JavaScript面对国际化编程时的一些建议,包括时区与语言编码等一些值得注意的问题...

JavaScript面对国际化编程时的一些建议,javascript一些建议

什么是国际化?

国际化(Internationalization的缩写是i18n——i,中间18个字符,n)是将软件处理的能让来自各种地方使用各种语言的用户更简单使用的一个过程。假定某个用户来自某个地方说某种语言,他可能不经意间就得到一些错误提示。尤其是你甚至都没有做这种假设。  

function formatDate(d)
{
 // Everyone uses month/date/year...right?
 var month = d.getMonth()   1;
 var date = d.getDate();
 var year = d.getFullYear();
 return month   "/"   date   "/"   year;
}

function formatMoney(amount)
{
 // All money is dollars with two fractional digits...right?
 return "$"   amount.toFixed(2);
}

function sortNames(names)
{
 function sortAlphabetically(a, b)
 {
 var left = a.toLowerCase(), right = b.toLowerCase();
 if (left > right)
  return 1;
 if (left === right)
  return 0;
 return -1;
 }

 // Names always sort alphabetically...right?
 names.sort(sortAlphabetically);
}

 
JavaScript过去的i18n支持太糟糕

传统JS的i18n程序使用toLocaleString()方法进行格式化。结果字符串包含实现自身提供的所有细节:没有办法自己选择(你确实需要那种date格式的weekday吗?year是无关紧要的吗?)。即使包含对应的细节,格式也可能是错的,比如本期望是百分比但得到的是数字。而且你还不能选择一个区域设置(locale)。

对于排序,JS提供了基本没用的基于区域设置(locale-sensitive)的文本比较函数。localeCompare()确实存在,但是其接口根本不适合sort。而且还不允许选择区域设置,或者排序方式。

这些限制太糟了(当我认识到时,我非常吃惊!),因为需要i18n支持(通常是金融站点用于显示货币)的严谨web应用会把数据打包,发给服务器,服务器进行操作,然后发回客户端。数据往返服务器仅仅为了处理货币的数量。Yeesh。

新的JS国际化API

新的ECMAScript国际化API大大提升了JS的i18n能力。 它提供了大家所能想到的格式化date、数字,文本排序的方式。区域设置是可选的,如果请求的区域设置不支持可以回退。格式化请求可以指定具体要包含的组件。支持自定义的百分比、有效数字、货币格式。开放了大量排序选项用于文本排序。如果你关心性能,首要的操作是选择一个区域设置,然后处理选项参数,现在这个操作只会处理一次,而不是之前每次区域设置相关的操作执行时都会被执行一遍。

这不是说,这个API是万能药,而仅仅是"尽最大努力"。精确的输出几乎总是故意不指定的。一份实现可以仅支持 oj 区域设置(合法的),也可以忽略(几乎全部)提供的格式化选项。大多数实现都包含高质量的多区域支持,但并不保证有(尤其是资源限定的系统,如手机)。

在底层,Firefox的实现依赖于Unicode 的国际化组件库(ICU) ,这个库又依赖 Unicode Common 区域数据仓库(CLDR)的区域数据集。我们的实现是自托管的:ICU之上的大部分实现用JS写的。在这个过程中,我们遇到了一些问题(我们从未如此大规模的自托管过),但基本上都不大。

Intl 接口(不是数字1,是字母l)

i18n 存在于 Intl 对象之上。Intl 包含3个构造函数:Intl.Collator, Intl.DateTimeFormat, 和Intl.NumberFormat。每个构造函数创建一个对象,这个对象提供相关操作、高效地为这些操作缓存区域设置和选项。按以下方式创建对象:  

var ctor = "Collator"; // 或其他 
var instance = new Intl[ctor](locales, options);

locales 是个字符串,指定单个语言标签,或者包含多个语言标签的类数组对象。语言标签如下面的字符串:en(普通英语),de-AT(奥地利德语),zh-Hant-TW(台湾使用的繁体中文)。语言标签可以包含一个“Unicode扩展”,形式为-u-key1-value1-key2-value2..., 其中每个key是“扩展key”。不同的构造函数对此进行具体解释。

opions 是个对象,其属性(如果不存在,就赋值为undefined)决定格式化器(formatter)和整理器(collator)的行为。精确的解释由构造函数决定。

给定区域信息和选项,实现会尝试生成近似理想行为的最接近行为。Firefox 支持用于整理(collation)的400 区域,用于date/time和数字格式化的600 区域,所以很可能(但不保证)你想要的区域是被支持的。

Intl 通常不保证某些特定行为。如果请求的区域不被支持,Intl 允诺“尽最大努力”的行为。即使区域是被支持的,行为也不是严格指定的。永远不要假设特定的选项集适用于某个特定格式。(围绕请求的组件)总体格式的用语可能因浏览器甚至浏览器的版本而不同。单个组件的格式是未指定的:weekday的短格式可以为“S”, “Sa”, 或“Sat”。Intl API并不用于公开精确的特定行为。

选项

date/time格式化的主要选项属性如下:

  •     weekday, era

    "narrow", "short", or "long".  (era通常指历法系统中长于一年的分段,如现行日皇统治, 或者其他纪年法)

  •     month

    "2-digit", "numeric", "narrow", "short", or "long"

  •     year
  •     day
  •     hour, minute, second

    "2-digit" or "numeric"

  •     timeZoneName

    "short" or "long"

  •     timeZone

    区分大小写的"UTC"通过对应的toUTC进行格式化。有些值如"CEST"和"America/New_York"不是必须被支持的,它们确实在当前Firefox下没有效果。

这些值并不映射到特定格式:记住Intl API几乎不指定精确的行为。Intl的目的,举例来说是"narrow", "short", 和"long"生成对应大小的“S”/“Sa”, “Sat”, 和“Saturday”(输出可能不太准确,因为Saturday和Sunday都可以生成“S”)。  "2-digit"和"numeric"映射到2位数字的字符串或者全长度的数字字符串,如“70”和“1970”。

最终使用的选项大部分是请求的选项。但是,如果你不指定请求的 weekday/year/month/day/hour/minute/second,那么 year/month/day 将会被加入到你提供的选项。

除此之外,还有些特殊的选项:

  •     hour12

    指定hour采用12小时还是24小时格式。默认通常是依赖于区域设置的(某些细节,如午夜是0点,还是12点,以及是否存在前导0,都是依赖于区域设置的)。

还有另外2种特殊属性,localeMatcher (可选"lookup"或"best fit") 和formatMatcher (可选"basic"或"best fit"),两者默认值都是"best fit"。这些会影响正确的区域设置和格式的选取。它们的用例可能比较难懂,就不赘述了。
区域设置相关选项

DateTimeFormat也允许通过自定义历法和数字系统来格式化。具体细节存在于区域设置,所以它们可以在语言标签的Unicode扩展中找到。

例如,泰国的泰语中语言标签为th-TH。回一下Unicode扩展的格式-u-key1-value1-key2-value2....  历法系统的key是ca, 数字系统的key时nu。泰语数字系统值为thai,中文历法系统值为chinese。因此用大体这样的方式来格式化date,我们把包含这些key/value对的Unicode追加到语言标签上去:th-TH-u-ca-chinese-nu-thai。

关于更多历法和数字系统的信息,查看DateTimeFormat的完整文档。
举例

创建DateTimeFormat对象后,下一步是通过方便的format()函数来格式化date。更方便的是,这个函数是有界函数(bound function):你不必在DateTimeFormat上直接调用。之后给它传递一个时间戳或者Date对象。

总结一下,下文是如何为特定用途创建DateTimeFormat选项的例子(在当前Firefox执行行为下)。  

var msPerDay = 24 * 60 * 60 * 1000; 

// July 17, 2014 00:00:00 UTC.
var july172014 = new Date(msPerDay * (44 * 365   11   197));

我们来格式化美国英语的date。我们先创建一个2位数字的month/day/year, 加上2位数字的hours/minutes, 还有一个短时区来确定这个时间。(结果肯定因不同时区而明显不同)  

var options =
 { year: "2-digit", month: "2-digit", day: "2-digit",
 hour: "2-digit", minute: "2-digit",
 timeZoneName: "short" };
var americanDateTime =
 new Intl.DateTimeFormat("en-US", options).format; 

print(americanDateTime(july172014)); // 07/16/14, 5:00 PM PDT

或者类似的,对葡萄牙语,最好是巴西使用的葡语,但是用在葡萄牙作品中的。格式会稍长,因为包含完整的year和正式拼写的month,但是因移植性要转成UTC格式。  

var options =
 { year: "numeric", month: "long", day: "numeric",
 hour: "2-digit", minute: "2-digit",
 timeZoneName: "short", timeZone: "UTC" };
var portugueseTime =
 new Intl.DateTimeFormat(["pt-BR", "pt-PT"], options); 

// 17 de julho de 2014 00:00 GMT
print(portugueseTime.format(july172014));

那对于一个压缩的,UTC格式的瑞士火车每周调度表?我们尝试用正式语言按流行度从大到小来选择最易读的一个。  

var swissLocales = ["de-CH", "fr-CH", "it-CH", "rm-CH"];var options =
 { weekday: "short",
 hour: "numeric", minute: "numeric",
 timeZone: "UTC", timeZoneName: "short" };
var swissTime =
 new Intl.DateTimeFormat(swissLocales, options).format; 

print(swissTime(july172014)); // Do. 00:00 GMT

或者我们尝试某个日本博物馆里的一幅画中的描述性文本中的date,这个date使用日本的year和era历法。  

var jpYearEra =
 new Intl.DateTimeFormat("ja-JP-u-ca-japanese",
       { year: "numeric", era: "long" }); 

print(jpYearEra.format(july172014)); // 平成26年

对一些完全不同的、更长的date,用于泰国泰语,但是使用泰语数字系统和中国历法。(类似Firefox的高质量实现通常会将普通的th-TH当做th-TH-u-ca-buddhist-nu-latn, 因为泰国使用佛历系统和拉丁0-9数字)。  

var options =
 { year: "numeric", month: "long", day: "numeric" };
var thaiDate =
 new Intl.DateTimeFormat("th-TH-u-nu-thai-ca-chinese", options); 

print(thaiDate.format(july172014)); // ?? 6 ??

撇开历法和数字系统,还是很简单的。只要选取自己的组件和长度。
 
选项

数字格式化的主要选项属性有:

  •     style

    "currency", "percent", or "decimal" (默认值).

  •     currency

    3字母货币代码,如USD、CHF。需要style是"currency", 不然没有意义

  •     currencyDisplay

    "code", "symbol", or "name", 默认为"symbol".  "code"使用格式字符串的3字母货币代码。"symbol"使用货币符号,如$或£。"name"通常使用某些正式拼写版本的货币。(Firefox 目前仅支持"symbol", 这个问题不就就修复)

  •     minimumIntegerDigits

    范围1到21(包含)的整数,默认为1。结果字符串的整数部分如果没有这么长,它前面会用0来填充。  (若这个值为2,那么3的格式化形式为“03”。)

  •     minimumFractionDigits, maximumFractionDigits

    0-20(包含)的整数。结果字符串至少minimumFractionDigits, 至多maximumFractionDigits个有效数字。如果style是"currency",默认最小值跟货币有关(通常是2,很少0或者3),不然就是0。默认最大值,百分比是0,数字是3,货币的最大值跟货币有关。

  •     minimumSignificantDigits, maximumSignificantDigits

    1-21(包含)的整数。如果有,它们将会覆盖上文关于整数/分数的对数字的控制,而由它们以及数字的要求长度,共同确定格式化的数字字符串中最小/最大有效数字的值。 (注意对10的倍数,有效数字可能不准确,如100,它的1,2,3位有效数字。)

  •     useGrouping

    布尔值(默认true)决定格式化字符串是否包含分组分隔符(如,英语的千分隔符“,”)。

NumberFormat还识别难懂的、大多数可忽略的localeMatcher属性。

区域化选项

在Unicode扩展中,使用nu关键字可以使DateTimeFormat支持自定义数字系统,NumberFormat也是这样。 例如,在中国,中文的语言标签是zh-CN。 汉语十进制数字系统对应的值是hanidec。 为了格式化这些系统的数字,我们在这些语言标签上添加一些Unicode扩展:zh-CN-u-nu-hanidec。

关于不同数字系统标识的完整信息,见NumberFormat详细说明文档。

示例

NumberFormat对象有一个 format方法,这一点和 DateTimeFormat相同。 format方法是一个有界函数,它有时可以独立于 NumberFormat使用。

下面是在当前Firefox环境下为特定用途创建NumberFormat选项的例子。首先,我们来格式化中国大陆中文的货币格式,特别是使用汉字数字(而不是更普遍的拉丁数字)。选择"currency" style, 然后使用renminbi(yuan)的货币代码,数字分组默认,小数部分数字采用通常做法。  

var tibetanRMBInChina =
 new Intl.NumberFormat("zh-CN-u-nu-hanidec",
      { style: "currency", currency: "CNY" }); 
print(tibetanRMBInChina.format(1314.25)); // ¥ 一,三一四.二五

或者我们来格式化美国的天然气价格,千分位有个古怪的9,用在美国英语中。  

var gasPrice =
 new Intl.NumberFormat("en-US",
      { style: "currency", currency: "USD",
       minimumFractionDigits: 3 }); 
print(gasPrice.format(5.259)); // $5.259

或者我们尝试埃及的阿拉伯语中的百分比。确定百分比有至少2个有效数字。(注意这个以及其他RTL例子可能在RTL上下文出现的顺序不一样,如?????? 而不是??????,RTL/right to left,从右到左的)  

var arabicPercent =
 new Intl.NumberFormat("ar-EG",
      { style: "percent",
       minimumFractionDigits: 2 }).format; 
print(arabicPercent(0.438)); // ??????

或者假设我们格式化阿富汗波斯语,我们期望至少2位的整数部分,至多2位的小数部分。  

var persianDecimal =
 new Intl.NumberFormat("fa-AF",
      { minimumIntegerDigits: 2,
       maximumFractionDigits: 2 }); 
print(persianDecimal.format(3.1416)); // ?????

最后,我们格式化巴林的阿拉伯语中的巴林第纳尔的数量。不同于大部分货币,巴林第纳尔等于1000费尔,因此我们需要三位小数位。(再次注意,不要太过相信表面的阅读顺序)?  

var bahrainiDinars =
 new Intl.NumberFormat("ar-BH",
      { style: "currency", currency: "BHD" }); 
print(bahrainiDinars.format(3.17)); // ?.?.? ?????

整理 选项

下面是整理的主要选项属性:

  •     usage

    "sort" or "search" (默认"sort"), 指定整理器(collator)的目的。(查找整理器可能比排序整理器更多考虑字符串是否相等。)

  •     sensitivity/敏感性

    "base", "accent", "case", or "variant"。这个选项影响整理器对基本字符相同但是重音/变音不同的字符的敏感性。(基本字符与区域设置有关:“a”和“?”在德语中基本字符相同,但是瑞典语中是不同的。)  "base"敏感性只考虑基本字符,忽略各种变体(如德语中“a”, “A”,和“?”被认为是相同的)。 "accent"敏感性考虑基本字符和重音,但是忽略大小写(如德语中的“a和“A”是相同的,“?”与两者不同)。"case"考虑基本字符和大小写,而忽略重音(如德语中的“a”和“?”相同,而与“A”不同)。"variant"考虑基本字符、重音、大小写(如德语的“a”, “?”和“A”均不同)。如果usage是"sort",默认"variant"; 否则与区域设置有关。

  •     numeric

    默认false的布尔值,决定字符串中的数字是否被当做数字参与比较。如当做数字的排序结果可能是"F-4 Phantom II", "F-14 Tomcat", "F-35 Lightning II"; 不当做数字的结果"F-14 Tomcat", "F-35 Lightning II", "F-4 Phantom II".

  •     caseFirst

    "upper", "lower", or "false" (默认)。决定比较时是否考虑大小写:"upper"把大写放在前面("B", "a", "c"), "lower"把小写放前面("a", "c", "B"), "false"完全忽略大小写("a", "B", "c")。 (注意,目前Firefox完全忽略这个属性)

  •     ignorePunctuation

    默认false的布尔值。决定比较时是否忽略标点(如"biweekly"和"bi-weekly"是否相等)。

localeMatcher属性你可以忽略了。

区域相关选项

区域的Unicode扩展部分指定的整理器主要选项是co,它选择排序操作的方式:电话本(phonebk), 字典 (dict), 还有其他。

另外,kn和kf这两个key可以选择拷贝选项对象的numeric和caseFirst属性。但是并不保证可用于语言标签,而且选项比语言标签的组件更清晰。所以最好在选项内部进行调整。

key-value对(paris)嵌入到Unicode的方式跟DateTimeFormat和NumberFormat相同; 想知道如何在语言标签中指定它们,可以查看对应的章节。

举例

整理器Collator对象有个比较函数属性。这个函数接受2个参数x和y, 如果x<y返回负值,x>y返回正值,x==y返回0。对于格式化函数,比较是个有界函数(bound function),可以抽取出来做其他用途。

我们尝试来给德国德语的姓氏进行排序。德语中实际上有2种排序方式,电话本和字典。电话本排序强调读音,比如“?”, “?”等近似被扩展成“ae”, “oe”等。  

var names =
 ["Hochberg", "H?nigswald", "Holzman"]; 
var germanPhonebook = new Intl.Collator("de-DE-u-co-phonebk"); 

//就像对["Hochberg", "Hoenigswald", "Holzman"]排序
// Hochberg, H?nigswald, Holzman
print(names.sort(germanPhonebook.compare).join(", "));

有些德语单词使用变音符进行词形变化,所以在字典中排序会忽略变音符(除了两个单词仅仅变音符不同:schon,sch?n)。  

var germanDictionary = new Intl.Collator("de-DE-u-co-dict"); 

//就像对["Hochberg", "Hoenigswald", "Holzman"]排序
// Hochberg, H?nigswald, Holzman
print(names.sort(germanDictionary.compare).join(", "));

或者我们来对美国英语的Firefox的版本进行排序,这些字符串故意打错(大小写不同,随机重音,变音标记,额外的连字符)。我们希望根据版本号进行排序,所以要做numeric排序,这样字符串中的数字才会作为数字参与比较,而不是逐字符的。  

var firefoxen =
 ["FireF?x 3.6",
 "Fire-fox 1.0",
 "Firefox 29",
 "Fírefox 3.5",
 "Fírefox 18"]; 
var usVersion =
 new Intl.Collator("en-US",
     { sensitivity: "base",
      numeric: true,
      ignorePunctuation: true }); 

// Fire-fox 1.0, Fírefox 3.5, FireF?x 3.6, Fírefox 18, Firefox 29
print(firefoxen.sort(usVersion.compare).join(", "));

最后,我们来做跟区域有关的字符串查找,查找忽略大小写和重音,并用于美国英语。

 

// Comparisons work with both composed and decomposed forms.
var decoratedBrowsers =
 [
 "Au0362maya", // A?maya
 "CHu035Br?me", // CH?r?me
 "Firefóx",
 "sAfàri",
 "ou0323pERA", // ?pERA
 "Iu0352E",  // I?E
 ]; 
var fuzzySearch =
 new Intl.Collator("en-US",
     { usage: "search", sensitivity: "base" }); 
function findBrowser(browser)
{
 function cmp(other)
 {
 return fuzzySearch.compare(browser, other) === 0;
 }
 return cmp; 
} 
print(decoratedBrowsers.findIndex(findBrowser("Firêfox"))); // 2 
print(decoratedBrowsers.findIndex(findBrowser("Saf?ri"))); // 3 
print(decoratedBrowsers.findIndex(findBrowser("?maya"))); // 0 
print(decoratedBrowsers.findIndex(findBrowser("?pera"))); // 4 
print(decoratedBrowsers.findIndex(findBrowser("Chromè"))); // 1 
print(decoratedBrowsers.findIndex(findBrowser("I?")));  // 5

琐碎

检测某个操作是否支持特定区域,或者一个区域是否被支持,会很有用。Intl在每个构造函数上都提供了supportedLocales()函数,在每个原型上提供了resolvedOptions()函数来公开这些信息。  

var navajoLocales =
 Intl.Collator.supportedLocalesOf(["nv"], { usage: "sort" });
print(navajoLocales.length > 0
  ? "Navajo collation supported"
  : "Navajo collation not supported"); 
var germanFakeRegion =
 new Intl.DateTimeFormat("de-XX", { timeZone: "UTC" });
var usedOptions = germanFakeRegion.resolvedOptions();
print(usedOptions.locale); // de
print(usedOptions.timeZone); // UTC

遗留行为

ES5的toLocaleString和localeCompar函数之前没有特定语义,不接受特定选项,基本上没有任何用处。因此i18n API根据Intl操作重组了它们。现在每个方法都接受附加的尾随locales和options参数,它们会像Intl构造函数一样被解释。(除了toLocaleTimeString 和 toLocaleDateString, 如果options没有,它们就会使用不同的默认组件)

对并不关心精确行为的简单应用,这没关系,老方法也可以用。但是如果需要更多控制或者多次格式化、比较的话,最好直接使用Intl。

什么是国际化? 国际化(Internationalization的缩写是i18n——i,中间18个字符,n)是将软...

System.Globalization 命名空间包含定义区域性相关信息的类,这些信息包括语言、国家/地区、使用的日历、日期、货币和数字的格式模式以及字符串的排序顺序。我们可以使用这些类编写全球化(国际化)应用程序。而像 StringInfo 和 TextInfo 这样的类更是为我们提供了诸如代理项支持和文本元素处理等高级全球化功能。

说明
Calendar 将时间分成段来表示,如分成星期、月和年。
CompareInfo 实现一组方法进行区分区域性的字符串比较。
CultureInfo 表示有关特定区域性的信息,包括区域性的名称、书写体系和使用的日历,以及有关对常用操作(如格式化日期和排序字符串)提供信息的区域性特定对象的访问。
DateTimeFormatInfo 定义如何根据区域性设置 DateTime 值的格式并显示这些值。
DaylightTime 定义夏时制周期。
GregorianCalendar 表示公历。
HebrewCalendar 表示犹太历。
HijriCalendar 表示回历。
JapaneseCalendar 表示日本历。
JulianCalendar 表示儒略历。
KoreanCalendar 表示朝鲜历。
NumberFormatInfo 根据区域性定义如何设置数值格式以及如何显示数值。
RegionInfo 包含有关国家/地区的信息。
SortKey 表示将字符串映射到其排序关键字的映射结果。
StringInfo 提供功能将字符串拆分为文本元素并循环访问这些文本元素。
TaiwanCalendar 表示台湾地区日历。
TextElementEnumerator 枚举字符串的文本元素。
TextInfo 定义特定于书写体系的属性和行为(如大小写)。
ThaiBuddhistCalendar 表示泰国佛历。

枚举

枚举 说明
CalendarWeekRule 定义确定年份第一周的不同规则。
CompareOptions 定义要用于 CompareInfo 的字符串比较选项。
CultureTypes 定义可以使用 CultureInfo.GetCultures 检索的区域性列表的类型。
DateTimeStyles 定义一些格式设置选项,这些选项自定义 DateTime.Parse 和 DateTime.ParseExact 方法如何分析一个字符串。
GregorianCalendarTypes 定义公历的不同语言版本。
NumberStyles 确定数字字符串参数中允许的样式,这些参数被传递到数字基类型类的 Parse 方法。
UnicodeCategory 定义字符的 Unicode 类别。

CultureInfo 类

表示有关特定区域性的信息,包括区域性的名称、书写体系和使用的日历,以及有关对常用操作(如格式化日期和排序字符串)提供信息的区域性特定对象的访问。

有关此类型所有成员的列表,请参阅 CultureInfo 成员。

System.Object
   System.Globalization.CultureInfo

[Visual Basic]
<Serializable>
Public Class CultureInfo
Implements ICloneable, IFormatProvider
[C#]
[Serializable]
public class CultureInfo : ICloneable, IFormatProvider
[C  ]
[Serializable]
public __gc class CultureInfo : public ICloneable, IFormatProvider
[JScript]
public
Serializable
class CultureInfo implements ICloneable, IFormatProvider

线程安全

此类型的所有公共静态(Visual Basic 中为 Shared)成员对多线程操作而言都是安全的。但不保证任何实例成员是线程安全的。

备注

CultureInfo 类保存区域性特定的信息,如关联的语言、子语言、国家/地区、日历和区域性约定。此类还提供对 DateTimeFormatInfo、NumberFormatInfo、CompareInfo 和 TextInfo 的区域性特定实例的访问。这些对象包含区域性特定操作(如大小写、格式化日期和数字以及比较字符串)所需的信息。

String 类间接地使用此类来获取有关默认区域性的信息。

区域性名称遵循 RFC 1766 标准,格式为“<languagecode2>-<country/regioncode2>”,其中 <languagecode2> 是从 ISO 639-1 派生的由两个小写字母构成的代码,<country/regioncode2> 是从 ISO 3166 派生的由两个大写字母构成的代码。例如,美国英语为“en-US”。在双字母语言代码不可用的情况中,将使用从 ISO 639-2 派生的三字母代码;例如,三字母代码“div”用于使用 Dhivehi 语言的区域。某些区域性名称带有指定书写符号的后缀;例如“-Cyrl”指定西里尔语书写符号,“-Latn”指定拉丁语书写符号。

此类和 System.Globalization 命名空间中的其他类接受并使用下列预定义的 CultureInfo 名称和标识符。

区域性名称 区域性标识符 语言-国家/地区
""(空字符串) 0x007F 固定区域性
af 0x0036 南非荷兰语
af-ZA 0x0436 南非荷兰语 - 南非
sq 0x001C 阿尔巴尼亚语
sq-AL 0x041C 阿尔巴尼亚语 - 阿尔巴尼亚
ar 0x0001 阿拉伯语
ar-DZ 0x1401 阿拉伯语 - 阿尔及利亚
ar-BH 0x3C01 阿拉伯语 - 巴林
ar-EG 0x0C01 阿拉伯语 - 埃及
ar-IQ 0x0801 阿拉伯语 - 伊拉克
ar-JO 0x2C01 阿拉伯语 - 约旦
ar-KW 0x3401 阿拉伯语 - 科威特
ar-LB 0x3001 阿拉伯语 - 黎巴嫩
ar-LY 0x1001 阿拉伯语 - 利比亚
ar-MA 0x1801 阿拉伯语 - 摩洛哥
ar-OM 0x2001 阿拉伯语 - 阿曼
ar-QA 0x4001 阿拉伯语 - 卡塔尔
ar-SA 0x0401 阿拉伯语 - 沙特阿拉伯
ar-SY 0x2801 阿拉伯语 - 叙利亚
ar-TN 0x1C01 阿拉伯语 - 突尼斯
ar-AE 0x3801 阿拉伯语 - 阿拉伯联合酋长国
ar-YE 0x2401 阿拉伯语 - 也门
hy 0x002B 亚美尼亚语
hy-AM 0x042B 亚美尼亚语 - 亚美尼亚
az 0x002C 阿泽里语
az-AZ-Cyrl 0x082C 阿泽里语(西里尔语)- 阿塞拜疆
az-AZ-Latn 0x042C 阿泽里语(拉丁)- 阿塞拜疆
eu 0x002D 巴斯克语
eu-ES 0x042D 巴斯克语 - 巴斯克地区
be 0x0023 白俄罗斯语
be-BY 0x0423 白俄罗斯语 - 白俄罗斯
bg 0x0002 保加利亚语
bg-BG 0x0402 保加利亚语 - 保加利亚
ca 0x0003 加泰罗尼亚语
ca-ES 0x0403 加泰罗尼亚语 - 加泰罗尼亚地区
zh-HK 0x0C04 中文 - 香港特别行政区
zh-MO 0x1404 中文 - 澳门特别行政区
zh-CN 0x0804 中文 - 中国
zh-CHS 0x0004 中文(简体)
zh-SG 0x1004 中文 - 新加坡
zh-TW 0x0404 中文 - 台湾
zh-CHT 0x7C04 中文(繁体)
hr 0x001A 克罗地亚语
hr-HR 0x041A 克罗地亚语 - 克罗地亚
cs 0x0005 捷克语
cs-CZ 0x0405 捷克语 - 捷克共和国
da 0x0006 丹麦语
da-DK 0x0406 丹麦语 - 丹麦
div 0x0065 马尔代夫语
div-MV 0x0465 马尔代夫语 - 马尔代夫
nl 0x0013 荷兰语
nl-BE 0x0813 荷兰语 - 比利时
nl-NL 0x0413 荷兰语 - 荷兰
en 0x0009 英语
en-AU 0x0C09 英语 - 澳大利亚
en-BZ 0x2809 英语 - 伯利兹
en-CA 0x1009 英语 - 加拿大
en-CB 0x2409 英语 - 加勒比
en-IE 0x1809 英语 - 爱尔兰
en-JM 0x2009 英语 - 牙买加
en-NZ 0x1409 英语 - 新西兰
en-PH 0x3409 英语 - 菲律宾
en-ZA 0x1C09 英语 - 南非
en-TT 0x2C09 英语 - 特立尼达和多巴哥
en-GB 0x0809 英语 - 英国
en-US 0x0409 英语 - 美国
en-ZW 0x3009 英语 - 津巴布韦
et 0x0025 爱沙尼亚语
et-EE 0x0425 爱沙尼亚语 - 爱沙尼亚
fo 0x0038 法罗语
fo-FO 0x0438 法罗语 - 法罗群岛
fa 0x0029 波斯语
fa-IR 0x0429 波斯语 - 伊朗
fi 0x000B 芬兰语
fi-FI 0x040B 芬兰语 - 芬兰
fr 0x000C 法语
fr-BE 0x080C 法语 - 比利时
fr-CA 0x0C0C 法语 - 加拿大
fr-FR 0x040C 法语 - 法国
fr-LU 0x140C 法语 - 卢森堡
fr-MC 0x180C 法语 - 摩纳哥
fr-CH 0x100C 法语 - 瑞士
gl 0x0056 加利西亚语
gl-ES 0x0456 加利西亚语 - 加利西亚地区
ka 0x0037 格鲁吉亚语
ka-GE 0x0437 格鲁吉亚语 - 格鲁吉亚
de 0x0007 德语
de-AT 0x0C07 德语 - 奥地利
de-DE 0x0407 德语 - 德国
de-LI 0x1407 德语 - 列支敦士登
de-LU 0x1007 德语 - 卢森堡
de-CH 0x0807 德语 - 瑞士
el 0x0008 希腊语
el-GR 0x0408 希腊语 - 希腊
gu 0x0047 古吉拉特语
gu-IN 0x0447 古吉拉特语 - 印度
he 0x000D 希伯来语
he-IL 0x040D 希伯来语 - 以色列
hi 0x0039 印地语
hi-IN 0x0439 印地语 - 印度
hu 0x000E 匈牙利语
hu-HU 0x040E 匈牙利语 - 匈牙利
is 0x000F 冰岛语
is-IS 0x040F 冰岛语 - 冰岛
id 0x0021 印度尼西亚语
id-ID 0x0421 印度尼西亚语 - 印度尼西亚
it 0x0010 意大利语
it-IT 0x0410 意大利语 - 意大利
it-CH 0x0810 意大利语 - 瑞士
ja 0x0011 日语
ja-JP 0x0411 日语 - 日本
kn 0x004B 卡纳达语
kn-IN 0x044B 卡纳达语 - 印度
kk 0x003F 哈萨克语
kk-KZ 0x043F 哈萨克语 - 哈萨克斯坦
kok 0x0057 贡根语
kok-IN 0x0457 贡根语 - 印度
ko 0x0012 朝鲜语
ko-KR 0x0412 朝鲜语 - 韩国
ky 0x0040 吉尔吉斯语
ky-KZ 0x0440 吉尔吉斯语 - 吉尔吉斯坦
lv 0x0026 拉脱维亚语
lv-LV 0x0426 拉脱维亚语 - 拉脱维亚
lt 0x0027 立陶宛语
lt-LT 0x0427 立陶宛语 - 立陶宛
mk 0x002F 马其顿语
mk-MK 0x042F 马其顿语 - FYROM
ms 0x003E 马来语
ms-BN 0x083E 马来语 - 文莱
ms-MY 0x043E 马来语 - 马来西亚
mr 0x004E 马拉地语
mr-IN 0x044E 马拉地语 - 印度
mn 0x0050 蒙古语
mn-MN 0x0450 蒙古语 - 蒙古
no 0x0014 挪威语
nb-NO 0x0414 挪威语(博克马尔)- 挪威
nn-NO 0x0814 挪威语(尼诺斯克)- 挪威
pl 0x0015 波兰语
pl-PL 0x0415 波兰语 - 波兰
pt 0x0016 葡萄牙语
pt-BR 0x0416 葡萄牙语 - 巴西
pt-PT 0x0816 葡萄牙语 - 葡萄牙
pa 0x0046 旁遮普语
pa-IN 0x0446 旁遮普语 - 印度
ro 0x0018 罗马尼亚语
ro-RO 0x0418 罗马尼亚语 - 罗马尼亚
ru 0x0019 俄语
ru-RU 0x0419 俄语 - 俄罗斯
sa 0x004F 梵语
sa-IN 0x044F 梵语 - 印度
sr-SP-Cyrl 0x0C1A 塞尔维亚语(西里尔语)- 塞尔维亚
sr-SP-Latn 0x081A 塞尔维亚语(拉丁)- 塞尔维亚
sk 0x001B 斯洛伐克语
sk-SK 0x041B 斯洛伐克语 - 斯洛伐克
sl 0x0024 斯洛文尼亚语
sl-SI 0x0424 斯洛文尼亚语 - 斯洛文尼亚
es 0x000A 西班牙语
es-AR 0x2C0A 西班牙语 - 阿根廷
es-BO 0x400A 西班牙语 - 玻利维亚
es-CL 0x340A 西班牙语 - 智利
es-CO 0x240A 西班牙语 - 哥伦比亚
es-CR 0x140A 西班牙语 - 哥斯达黎加
es-DO 0x1C0A 西班牙语 - 多米尼加共和国
es-EC 0x300A 西班牙语 - 厄瓜多尔
es-SV 0x440A 西班牙语 - 萨尔瓦多
es-GT 0x100A 西班牙语 - 危地马拉
es-HN 0x480A 西班牙语 - 洪都拉斯
es-MX 0x080A 西班牙语 - 墨西哥
es-NI 0x4C0A 西班牙语 - 尼加拉瓜
es-PA 0x180A 西班牙语 - 巴拿马
es-PY 0x3C0A 西班牙语 - 巴拉圭
es-PE 0x280A 西班牙 - 秘鲁
es-PR 0x500A 西班牙语 - 波多黎各
es-ES 0x0C0A 西班牙语 - 西班牙
es-UY 0x380A 西班牙语 - 乌拉圭
es-VE 0x200A 西班牙语 - 委内瑞拉
sw 0x0041 斯瓦希里语
sw-KE 0x0441 斯瓦希里语 - 肯尼亚
sv 0x001D 瑞典语
sv-FI 0x081D 瑞典语 - 芬兰
sv-SE 0x041D 瑞典语 - 瑞典
syr 0x005A 叙利亚语
syr-SY 0x045A 叙利亚语 - 叙利亚
ta 0x0049 泰米尔语
ta-IN 0x0449 泰米尔语 - 印度
tt 0x0044 鞑靼语
tt-RU 0x0444 鞑靼语 - 俄罗斯
te 0x004A 泰卢固语
te-IN 0x044A 泰卢固语 - 印度
th 0x001E 泰语
th-TH 0x041E 泰语 - 泰国
tr 0x001F 土耳其语
tr-TR 0x041F 土耳其语 - 土耳其
uk 0x0022 乌克兰语
uk-UA 0x0422 乌克兰语 - 乌克兰
ur 0x0020 乌尔都语
ur-PK 0x0420 乌尔都语 - 巴基斯坦
uz 0x0043 乌兹别克语
uz-UZ-Cyrl 0x0843 乌兹别克语(西里尔语)- 乌兹别克斯坦
uz-UZ-Latn 0x0443 乌兹别克语(拉丁)- 乌兹别克斯坦
vi 0x002A 越南语
vi-VN 0x042A 越南语 - 越南

“西班牙语 - 西班牙”的区域性标识符“0x0c0a”使用默认的国际排序顺序;而区域性标识符“0x040A”(也指“西班牙语

  • 西班牙”)则使用传统排序顺序。如果使用“es-ES”区域性名称构造 CultureInfo,则新的 CultureInfo 将使用默认的国际排序顺序。要构造一个使用传统排序顺序的 CultureInfo,可在构造函数中使用区域性标识符“0x040A”。有关具有备用排序方法的其他区域性的更多信息,请参见“使用备用排序顺序”。

这些区域性通常分为三个集合:固定区域性、非特定区域性和特定区域性。

固定区域性不区分区域性。可以使用空字符串 ("") 按名称或者按区域性标识符 0x007F 来指定固定区域性。InvariantCulture 检索固定区域性的实例。它与英语语言关联,但不与任何国家/地区关联。它几乎可用在要求区域性的“全局化”命名空间中的所有方法中。如果安全决策取决于字符串比较或大小写更改操作,则使用 InvariantCulture 确保无论如何设置系统的区域性,行为都将保持一致。但是,固定区域性必须仅由需要不依赖区域性的结果的进程(如系统服务)使用;否则,它得到的结果可能在语言上不正确,或者在文化上不合适。

非特定区域性是与某种语言关联但不与国家/地区关联的区域性。特定区域性是与某种语言和某个国家/地区关联的区域性。例如,“fr”是非特定区域性,而“fr-FR”是特定区域性。注意,“zh-CHS”(简体中文)和“zh-CHT”(繁体中文)均为非特定区域性。

区域性有层次结构,即特定区域性的父级是非特定区域性,而非特定区域性的父级是 InvariantCulture。Parent 属性将返回与特定区域性关联的非特定区域性。

如果特定区域性的资源在系统中不可用,则使用非特定区域性的资源;如果非特定区域性的资源也不可用,那么使用主程序集中嵌入的资源。有关资源备用进程的更多信息,请参见“资源备用进程”。

Windows API 中的区域性列表与 .NET Framework 中的区域性列表略有不同。例如,在 Windows API 中未提供带有区域性标识符 0x7C04 的非特定区域性 zh-CHT“中文(繁体)”。如果需要具备同 Windows 进行互操作的能力(例如,通过 p/invoke 机制),可使用在 .NET Framework 中定义的特定区域性。这样可以确保与等效的 Windows 区域设置保持一致,它们使用同一 LCID 进行标识。

只能为固定区域性或特定区域性创建 DateTimeFormatInfo 或 NumberFormatInfo,而不能为非特定区域性创建它们。

用户可以通过“控制面板”中的“区域和语言选项”(或“区域选项”或“区域设置”)选择重写某些与 Windows 的当前区域性关联的值。例如,用户可能选择以另一种格式显示日期,或选择使用区域性默认设置以外的货币。

如果 UseUserOverride 为 true 并且指定的区域性与当前 Windows 的区域性匹配,则 CultureInfo 使用那些重写,包括以下属性的用户设置:由 DateTimeFormat 属性返回的 DateTimeFormatInfo 实例的属性、由 NumberFormat 属性返回的 NumberFormatInfo 实例的属性,以及由 CompareInfo 属性返回的 CompareInfo 实例的属性。如果用户设置与 CultureInfo 的关联区域性不兼容(例如选定的日历不属于 OptionalCalendars 其中之一),则方法结果和属性值是未定义的。

对于使用欧元的区域性,.NET Framework 和 Windows XP 将默认货币设置为欧元;但是,旧版本的 Windows 却不是这样。因此,如果旧版本 Windows 的用户未通过“控制面板”中的“区域选项”或“区域设置”更改货币设置,则货币可能不正确。若要使用 .NET Framework 的货币的默认设置,请使用接受 useUserOverride 参数的 CultureInfo 构造函数重载,并将该参数设置为 false。

该类实现 ICloneable 接口以启用 CultureInfo 对象的复制。它还实现 IFormatProvider 以便为应用程序提供格式化信息。

示例

[Visual Basic, C#, C ] 下面的代码示例显示如何按国际排序创建一个用于“西班牙语-西班牙”的 CultureInfo,并按传统排序创建另一个 CultureInfo。

[C#]
using System;
using System.Collections;
using System.Globalization;
public class SamplesCultureInfo  {
public static void Main()  {
// Creates and initializes the CultureInfo which uses the international sort.
CultureInfo myCIintl = new CultureInfo( "es-ES", false );
// Creates and initializes the CultureInfo which uses the traditional sort.
CultureInfo myCItrad = new CultureInfo( 0x040A, false );
// Displays the properties of each culture.
Console.WriteLine( "{0,-33}{1,-25}{2,-25}", "PROPERTY", "INTERNATIONAL", "TRADITIONAL" );
Console.WriteLine( "{0,-33}{1,-25}{2,-25}", "CompareInfo", myCIintl.CompareInfo, myCItrad.CompareInfo );
Console.WriteLine( "{0,-33}{1,-25}{2,-25}", "DisplayName", myCIintl.DisplayName, myCItrad.DisplayName );
Console.WriteLine( "{0,-33}{1,-25}{2,-25}", "EnglishName", myCIintl.EnglishName, myCItrad.EnglishName );
Console.WriteLine( "{0,-33}{1,-25}{2,-25}", "IsNeutralCulture", myCIintl.IsNeutralCulture, myCItrad.IsNeutralCulture );
Console.WriteLine( "{0,-33}{1,-25}{2,-25}", "IsReadOnly", myCIintl.IsReadOnly, myCItrad.IsReadOnly );
Console.WriteLine( "{0,-33}{1,-25}{2,-25}", "LCID", myCIintl.LCID, myCItrad.LCID );
Console.WriteLine( "{0,-33}{1,-25}{2,-25}", "Name", myCIintl.Name, myCItrad.Name );
Console.WriteLine( "{0,-33}{1,-25}{2,-25}", "NativeName", myCIintl.NativeName, myCItrad.NativeName );
Console.WriteLine( "{0,-33}{1,-25}{2,-25}", "Parent", myCIintl.Parent, myCItrad.Parent );
Console.WriteLine( "{0,-33}{1,-25}{2,-25}", "TextInfo", myCIintl.TextInfo, myCItrad.TextInfo );
Console.WriteLine( "{0,-33}{1,-25}{2,-25}", "ThreeLetterISOLanguageName", myCIintl.ThreeLetterISOLanguageName, myCItrad.ThreeLetterISOLanguageName );
Console.WriteLine( "{0,-33}{1,-25}{2,-25}", "ThreeLetterWindowsLanguageName", myCIintl.ThreeLetterWindowsLanguageName, myCItrad.ThreeLetterWindowsLanguageName );
Console.WriteLine( "{0,-33}{1,-25}{2,-25}", "TwoLetterISOLanguageName", myCIintl.TwoLetterISOLanguageName, myCItrad.TwoLetterISOLanguageName );
Console.WriteLine();
// Compare two strings using myCIintl.
Console.WriteLine( "Comparing "llegar" and "lugar"" );
Console.WriteLine( "   With myCIintl.CompareInfo.Compare: {0}", myCIintl.CompareInfo.Compare( "llegar", "lugar" ) );
Console.WriteLine( "   With myCItrad.CompareInfo.Compare: {0}", myCItrad.CompareInfo.Compare( "llegar", "lugar" ) );
}
}
/*
This code produces the following output.
PROPERTY                         INTERNATIONAL            TRADITIONAL
CompareInfo                      CompareInfo - 3082       CompareInfo - 1034
DisplayName                      Spanish (Spain)          Spanish (Spain)
EnglishName                      Spanish (Spain)          Spanish (Spain)
IsNeutralCulture                 False                    False
IsReadOnly                       False                    False
LCID                             3082                     1034
Name                             es-ES                    es-ES
NativeName                       espaol (Espaa)         espaol (Espaa)
Parent                           es                       es
TextInfo                         TextInfo - 3082          TextInfo - 1034
ThreeLetterISOLanguageName       spa                      spa
ThreeLetterWindowsLanguageName   ESN                      ESN
TwoLetterISOLanguageName         es                       es
Comparing "llegar" and "lugar"
With myCIintl.CompareInfo.Compare: -1
With myCItrad.CompareInfo.Compare: 1
*/
[Visual Basic, C#, C  ] 下面的代码示例使用中文确定每个特定区域性的父区域性。

[C#]
using System;
using System.Globalization;
public class SamplesCultureInfo  {
public static void Main()  {
// Prints the header.
Console.WriteLine( "SPECIFIC CULTURE                                  PARENT CULTURE" );
// Determines the specific cultures that use the Chinese language, and displays the parent culture.
foreach ( CultureInfo ci in CultureInfo.GetCultures( CultureTypes.SpecificCultures ) )  {
if ( ci.TwoLetterISOLanguageName == "zh" )  {
Console.Write( "0x{0} {1} {2,-37}", ci.LCID.ToString("X4"), ci.Name, ci.EnglishName );
Console.WriteLine( "0x{0} {1} {2}", ci.Parent.LCID.ToString("X4"), ci.Parent.Name, ci.Parent.EnglishName );
}
}
}
}
/*
This code produces the following output.
SPECIFIC CULTURE                                  PARENT CULTURE
0x0404 zh-TW Chinese (Taiwan)                     0x7C04 zh-CHT Chinese (Traditional)
0x0804 zh-CN Chinese (People's Republic of China) 0x0004 zh-CHS Chinese (Simplified)
0x0C04 zh-HK Chinese (Hong Kong S.A.R.)           0x7C04 zh-CHT Chinese (Traditional)
0x1004 zh-SG Chinese (Singapore)                  0x0004 zh-CHS Chinese (Simplified)
0x1404 zh-MO Chinese (Macau S.A.R.)               0x0004 zh-CHS Chinese (Simplified)
*/
[C  ]
#using <mscorlib.dll>
using namespace System;
using namespace System::Globalization;
int main() {
// Prints the header.
Console::WriteLine(S"SPECIFIC CULTURE                                  PARENT CULTURE" );
// Determines the specific cultures that use the Chinese language,
// and displays the parent culture.
System::Collections::IEnumerator* en =
CultureInfo::GetCultures(CultureTypes::SpecificCultures)->GetEnumerator();
while (en->MoveNext())
{
CultureInfo* ci = __try_cast<CultureInfo*>(en->Current);
if (ci->TwoLetterISOLanguageName->Equals(S"zh"))
{
Console::Write(S"0x{0} {1} {2,-37}", ci->LCID.ToString("X4"),
ci->Name, ci->EnglishName);
Console::WriteLine(S"0x{0} {1} {2}", ci->Parent->LCID.ToString(S"X4"),
ci->Parent->Name, ci->Parent->EnglishName);
}
}
}
/*
This code produces the following output.
SPECIFIC CULTURE                                  PARENT CULTURE
0x0404 zh-TW Chinese (Taiwan)                     0x7C04 zh-CHT Chinese (Traditional)
0x0804 zh-CN Chinese (People's Republic of China) 0x0004 zh-CHS Chinese (Simplified)
0x0C04 zh-HK Chinese (Hong Kong S.A.R.)           0x7C04 zh-CHT Chinese (Traditional)
0x1004 zh-SG Chinese (Singapore)                  0x0004 zh-CHS Chinese (Simplified)
0x1404 zh-MO Chinese (Macau S.A.R.)               0x0004 zh-CHS Chinese (Simplified)
*/

 
.NET Framework 类库  

DateTime.ParseExact 方法 (String, String, IFormatProvider, DateTimeStyles)

使用指定的格式、区域性特定格式信息和样式,将日期和时间的指定字符串表示形式转换为其等效的 DateTime。字符串表示的格式必须与指定的格式完全匹配。

[Visual Basic]
Overloads Public Shared Function ParseExact( _
ByVal s As String, _
ByVal format As String, _
ByVal provider As IFormatProvider, _
ByVal style As DateTimeStyles _
) As DateTime
[C#]
public static DateTime ParseExact(
string s,
string format,
IFormatProvider provider,
DateTimeStyles style
);
[C  ]
public: static DateTime ParseExact(
String* s,
String* format,
IFormatProvider* provider,
DateTimeStyles style
);
[JScript]
public static function ParseExact(
s : String,
format : String,
provider : IFormatProvider,
style : DateTimeStyles
) : DateTime;

参数

s
包含要转换的日期和时间的字符串。

format
s 的预期格式。

provider
一个 IFormatProvider,它提供有关 s 的区域性特定格式设置信息。

style
一个或多个 DateTimeStyles 常数的组合,用以指示 s 的允许格式。

返回值

DateTime,等效于由 format、provider 和 style 所指定的 s 中所包含的日期和时间。

异常

异常类型 条件
ArgumentNullException s 或 format 为空引用(Visual Basic 中为 Nothing)。
FormatException s 或 format 是空字符串

- 或 -

s 不包含与 format 中指定的模式相对应的日期和时间。

备注

如果 s 的格式与 format 中的格式模式所指定的格式不完全匹配,则此方法引发 FormatException。如果 format 由单个标准格式的字符组成,则使用该字符所表示的格式模式。有关更多信息,请参见 DateTimeFormatInfo 主题。

如果 s 中包含时间不包含日期,则 style 参数确定是使用当前日期还是使用默认日期。如果 s 中包含日期不包含时间,则使用午夜 12 点。style 参数还确定是否忽略前置的、内部的或后随的空白字符。

provider 参数提供区域性特定的日期和时间格式信息。例如,用特定语言表示的一周内各天的名称,或年、月和日的惯用表示顺序。如果 provider 为空引用(Visual Basic 中为 Nothing),则使用当前区域性。

示例

[Visual Basic, C#, C ] 下面的示例说明 ParseExact 方法。

[Visual Basic]
Imports System
Imports System.Globalization
Class Class1
Public Shared Sub Main()
' Assume the current culture is en-US.
' The date is Feburary 16, 1992, 12 hours, 15 minutes and 12 seconds.
Dim myDateTimeValue As String = "2/16/1992 12:15:12"
Dim myDateTime As DateTime = DateTime.Parse(myDateTimeValue)
Console.WriteLine("1) myDateTime       = {0}", myDateTime)
' Reverse month and day to conform to a different culture.
' The date is Feburary 16, 1992, 12 hours, 15 minutes and 12 seconds.
Dim culture = New CultureInfo("fr-FR", True)
Dim myDateTimeFrenchValue As String = "    16/02/1992 12:15:12"
Dim myDateTimeFrench As DateTime = _
DateTime.Parse(myDateTimeFrenchValue, _
culture, _
DateTimeStyles.NoCurrentDateDefault)
Console.WriteLine("2) myDateTimeFrench = {0}", myDateTimeFrench)
' The date is Feburary 16, 1992, 12 hours, 15 minutes and 12 seconds.
Dim expectedFormats As String() =  {"G", "g", "f", "F"}
myDateTimeFrench = DateTime.ParseExact(myDateTimeFrenchValue, _
expectedFormats, _
culture, _
DateTimeStyles.AllowWhiteSpaces)
Console.WriteLine("3) myDateTimeFrench = {0}", myDateTimeFrench)
End Sub 'Main
End Class 'Class1
'
'This example yields the following results:
'
'1) myDateTime       = 2/16/1992 12:15:12 PM
'2) myDateTimeFrench = 2/16/1992 12:15:12 PM
'3) myDateTimeFrench = 2/16/1992 12:15:12 PM
'
[C#]
using System;
using System.Globalization;
namespace Parse
{
class Class1
{
public static void Main(string[] args)
{
// Assume the current culture is en-US.
// The date is Feburary 16, 1992, 12 hours, 15 minutes and 12 seconds.
string myDateTimeValue = "2/16/1992 12:15:12";
DateTime myDateTime = DateTime.Parse(myDateTimeValue);
Console.WriteLine("1) myDateTime       = {0}", myDateTime);
// Reverse month and day to conform to a different culture.
// The date is Feburary 16, 1992, 12 hours, 15 minutes and 12 seconds.
IFormatProvider culture = new CultureInfo("fr-FR", true);
string myDateTimeFrenchValue = "    16/02/1992 12:15:12";
DateTime myDateTimeFrench =
DateTime.Parse(myDateTimeFrenchValue,
culture,
DateTimeStyles.NoCurrentDateDefault);
Console.WriteLine("2) myDateTimeFrench = {0}", myDateTimeFrench);
// The date is Feburary 16, 1992, 12 hours, 15 minutes and 12 seconds.
string[] expectedFormats = {"G", "g", "f" ,"F"};
myDateTimeFrench =
DateTime.ParseExact(myDateTimeFrenchValue,
expectedFormats,
culture,
DateTimeStyles.AllowWhiteSpaces);
Console.WriteLine("3) myDateTimeFrench = {0}", myDateTimeFrench);
}
}
}
/*
This example yields the following results:
1) myDateTime       = 2/16/1992 12:15:12 PM
2) myDateTimeFrench = 2/16/1992 12:15:12 PM
3) myDateTimeFrench = 2/16/1992 12:15:12 PM
*/
[C  ]
#using <mscorlib.dll>
using namespace System;
using namespace System::Globalization;
int main() {
// Assume the current culture is en-US.
// The date is Feburary 16, 1992, 12 hours, 15 minutes and 12 seconds.
String* myDateTimeValue = S"2/16/1992 12:15:12";
DateTime myDateTime = DateTime::Parse(myDateTimeValue);
Console::WriteLine(S"1) myDateTime       = {0}", __box(myDateTime));
// Reverse month and day to conform to a different culture.
// The date is Feburary 16, 1992, 12 hours, 15 minutes and 12 seconds.
IFormatProvider* culture = new CultureInfo(S"fr-FR", true);
String* myDateTimeFrenchValue = S"    16/02/1992 12:15:12";
DateTime myDateTimeFrench =
DateTime::Parse(myDateTimeFrenchValue,
culture,
DateTimeStyles::NoCurrentDateDefault);
Console::WriteLine(S"2) myDateTimeFrench = {0}", __box(myDateTimeFrench));
// The date is Feburary 16, 1992, 12 hours, 15 minutes and 12 seconds.
String* expectedFormats[] = {S"G", S"g", S"f" , S"F"};
myDateTimeFrench =
DateTime::ParseExact(myDateTimeFrenchValue,
expectedFormats,
culture,
DateTimeStyles::AllowWhiteSpaces);
Console::WriteLine(S"3) myDateTimeFrench = {0}", __box(myDateTimeFrench));
}
/*
This example yields the following results:
1) myDateTime       = 2/16/1992 12:15:12 PM
2) myDateTimeFrench = 2/16/1992 12:15:12 PM
3) myDateTimeFrench = 2/16/1992 12:15:12 PM
*/

[JScript] 没有可用于 JScript 的示例。若要查看 Visual Basic、C# 或 C 示例,请单击页左上角的“语言筛选器”按钮 金沙棋牌官方平台 1

要求

平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 系列, .NET Framework 精简版, 公共语言基础结构 (CLI) 标准

请参见

注释:
string[] expectedFormats = {"G", "g", "f" ,"F"};的意思呢?如下

.NET Framework 类库  

 

DateTimeFormatInfo 类

定义如何根据区域性设置 DateTime 值的格式并显示这些值。

有关此类型所有成员的列表,请参阅 DateTimeFormatInfo 成员。

System.Object
   System.Globalization.DateTimeFormatInfo

[Visual Basic]
<Serializable>
NotInheritable Public Class DateTimeFormatInfo
Implements ICloneable, IFormatProvider
[C#]
[Serializable]
public sealed class DateTimeFormatInfo : ICloneable,
IFormatProvider
[C  ]
[Serializable]
public __gc __sealed class DateTimeFormatInfo : public ICloneable,
IFormatProvider
[JScript]
public
Serializable
class DateTimeFormatInfo implements ICloneable,
IFormatProvider

线程安全

此类型的所有公共静态(Visual Basic 中为 Shared)成员是线程安全的。但不保证任何实例成员是线程安全的。

备注

此类包含各种信息,例如日期模式、时间模式和 AM/PM 指示项。

若要为特定区域性创建 DateTimeFormatInfo,请为该区域性创建 CultureInfo 并检索 CultureInfo.DateTimeFormat 属性。若要为当前线程的区域性创建 DateTimeFormatInfo,请使用 CurrentInfo 属性。若要为固定区域性创建 DateTimeFormatInfo,请将 InvariantInfo 属性用于只读版本,或将 DateTimeFormatInfo 构造函数用于可写版本。不可能为非特定区域性创建 DateTimeFormatInfo。

用户可以通过“控制面板”中的“区域和语言选项”(或“区域选项”或“区域设置”)选择重写某些与 Windows 的当前区域性关联的值。例如,用户可能选择以另一种格式显示日期,或选择使用区域性默认设置以外的货币。如果 CultureInfo.UseUserOverride 属性设置为 true,则还将从用户设置中检索 CultureInfo.DateTimeFormat 实例、CultureInfo.NumberFormat 实例和 CultureInfo.TextInfo 实例的属性。如果用户设置与 CultureInfo 的关联区域性不兼容(例如选定的日历不属于 OptionalCalendars 其中之一),则方法结果和属性值是未定义的。

使用在 DateTimeFormatInfo 的属性中存储的标准或自定义模式设置 DateTime 值的格式。

可以通过设置可写 DateTimeFormatInfo 的关联属性用自定义模式替代标准模式。若要确定 DateTimeFormatInfo 是否是可写的,请使用 IsReadOnly 属性。

下表列出了每一种标准模式的标准格式字符以及可以进行设置以修改标准模式的关联 DateTimeFormatInfo 属性。格式字符区分大小写;例如,“g”和“G”所代表的模式稍有不同。

格式字符 关联属性/说明
d ShortDatePattern
D LongDatePattern
f 完整日期和时间(长日期和短时间)
F FullDateTimePattern(长日期和长时间)
g 常规(短日期和短时间)
G 常规(短日期和长时间)
m、M MonthDayPattern
r、R RFC1123Pattern
s 使用当地时间的 SortableDateTimePattern(基于 ISO 8601)
t ShortTimePattern
T LongTimePattern
u UniversalSortableDateTimePattern 用于显示通用时间的格式
U 使用通用时间的完整日期和时间(长日期和长时间)
y、Y YearMonthPattern

下表列出了可被合并以构造自定义模式的模式。这些模式是区分大小写的;例如,识别“MM”,但不识别“mm”。如果自定义模式包含空白字符或用单引号括起来的字符,则输出字符串页也将包含这些字符。未定义为格式模式的一部分或未定义为格式字符的字符按其原义复制。

格式模式 说明
d 月中的某一天。一位数的日期没有前导零。
dd 月中的某一天。一位数的日期有一个前导零。
ddd 周中某天的缩写名称,在 AbbreviatedDayNames 中定义。
dddd 周中某天的完整名称,在 DayNames 中定义。
M 月份数字。一位数的月份没有前导零。
MM 月份数字。一位数的月份有一个前导零。
MMM 月份的缩写名称,在 AbbreviatedMonthNames 中定义。
MMMM 月份的完整名称,在 MonthNames 中定义。
y 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。
yy 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示具有前导零的年份。
yyyy 包括纪元的四位数的年份。
gg 时期或纪元。如果要设置格式的日期不具有关联的时期或纪元字符串,则忽略该模式。
h 12 小时制的小时。一位数的小时数没有前导零。
hh 12 小时制的小时。一位数的小时数有前导零。
H 24 小时制的小时。一位数的小时数没有前导零。
HH 24 小时制的小时。一位数的小时数有前导零。
m 分钟。一位数的分钟数没有前导零。
mm 分钟。一位数的分钟数有一个前导零。
s 秒。一位数的秒数没有前导零。
ss 秒。一位数的秒数有一个前导零。
f 秒的小数精度为一位。其余数字被截断。
ff 秒的小数精度为两位。其余数字被截断。
fff 秒的小数精度为三位。其余数字被截断。
ffff 秒的小数精度为四位。其余数字被截断。
fffff 秒的小数精度为五位。其余数字被截断。
ffffff 秒的小数精度为六位。其余数字被截断。
fffffff 秒的小数精度为七位。其余数字被截断。
t AMDesignatorPMDesignator 中定义的 AM/PM 指示项的第一个字符(如果存在)。
tt AMDesignatorPMDesignator 中定义的 AM/PM 指示项(如果存在)。
z 时区偏移量(“ ”或“-”后面仅跟小时)。一位数的小时数没有前导零。例如,太平洋标准时间是“-8”。
zz 时区偏移量(“ ”或“-”后面仅跟小时)。一位数的小时数有前导零。例如,太平洋标准时间是“-08”。
zzz 完整时区偏移量(“ ”或“-”后面跟有小时和分钟)。一位数的小时数和分钟数有前导零。例如,太平洋标准时间是“-08:00”。
: TimeSeparator 中定义的默认时间分隔符。
/ DateSeparator 中定义的默认日期分隔符。
% c 其中 c 是格式模式(如果单独使用)。如果格式模式与原义字符或其他格式模式合并,则可以省略“%”字符。
c 其中 c 是任意字符。照原义显示字符。若要显示反斜杠字符,请使用“\”。

只有上面第二个表中列出的格式模式才能用于创建自定义模式;在第一个表中列出的标准格式字符不能用于创建自定义模式。自定义模式的长度至少为两个字符;例如,

  • DateTime.ToString( "d") 返回 DateTime 值;“d”是标准短日期模式。
  • DateTime.ToString( "%d") 返回月中的某天;“%d”是自定义模式。
  • DateTime.ToString( "d ") 返回后面跟有一个空白字符的月中的某天;“d”是自定义模式。

只能为固定区域性或特定区域性创建 DateTimeFormatInfo 或 NumberFormatInfo,而不能为非特定区域性创建它们。有关固定区域性、特定区域性和非特定区域性的更多信息,请参见 CultureInfo 类。

该类实现 ICloneable 接口以启用 DateTimeFormatInfo 对象的复制。它还实现 IFormatProvider 以便为应用程序提供格式化信息。

示例

[Visual Basic, C#, C ] 下面的代码示例使用格式字符输出 en-US 区域性的不同格式模式。该示例还将显示与格式字符关联的属性值。

[Visual Basic]
Imports System
Imports System.Globalization
Imports Microsoft.VisualBasic
Public Class SamplesDTFI
Public Shared Sub Main()
' Creates and initializes a DateTimeFormatInfo associated with the en-US culture.
Dim myDTFI As DateTimeFormatInfo = New CultureInfo("en-US", False).DateTimeFormat
' Creates a DateTime with the Gregorian date January 3, 2002 (year=2002, month=1, day=3).
' The Gregorian calendar is the default calendar for the en-US culture.
Dim myDT As New DateTime(2002, 1, 3)
' Displays the format pattern associated with each format character.
Console.WriteLine("FORMAT  en-US EXAMPLE")
Console.WriteLine("CHAR    VALUE OF ASSOCIATED PROPERTY, IF ANY")
Console.WriteLine()
Console.WriteLine("  d     {0}", myDT.ToString("d"))
Console.WriteLine("        {0} {1}", myDTFI.ShortDatePattern, "(ShortDatePattern)")
Console.WriteLine()
Console.WriteLine("  D     {0}", myDT.ToString("D"))
Console.WriteLine("        {0} {1}", myDTFI.LongDatePattern, "(LongDatePattern)")
Console.WriteLine()
Console.WriteLine("  f     {0}", myDT.ToString("f"))
Console.WriteLine()
Console.WriteLine("  F     {0}", myDT.ToString("F"))
Console.WriteLine("        {0} {1}", myDTFI.FullDateTimePattern, "(FullDateTimePattern)")
Console.WriteLine()
Console.WriteLine("  g     {0}", myDT.ToString("g"))
Console.WriteLine()
Console.WriteLine("  G     {0}", myDT.ToString("G"))
Console.WriteLine()
Console.WriteLine("  m     {0}", myDT.ToString("m"))
Console.WriteLine("        {0} {1}", myDTFI.MonthDayPattern, "(MonthDayPattern)")
Console.WriteLine()
Console.WriteLine("  M     {0}", myDT.ToString("M"))
Console.WriteLine("        {0} {1}", myDTFI.MonthDayPattern, "(MonthDayPattern)")
Console.WriteLine()
Console.WriteLine("  r     {0}", myDT.ToString("r"))
Console.WriteLine("        {0} {1}", myDTFI.RFC1123Pattern, "(RFC1123Pattern)")
Console.WriteLine()
Console.WriteLine("  R     {0}", myDT.ToString("R"))
Console.WriteLine("        {0} {1}", myDTFI.RFC1123Pattern, "(RFC1123Pattern)")
Console.WriteLine()
Console.WriteLine("  s     {0}", myDT.ToString("s"))
Console.WriteLine("        {0} {1}", myDTFI.SortableDateTimePattern, "(SortableDateTimePattern)")
Console.WriteLine()
Console.WriteLine("  t     {0}", myDT.ToString("t"))
Console.WriteLine("        {0} {1}", myDTFI.ShortTimePattern, "(ShortTimePattern)")
Console.WriteLine()
Console.WriteLine("  T     {0}", myDT.ToString("T"))
Console.WriteLine("        {0} {1}", myDTFI.LongTimePattern, "(LongTimePattern)")
Console.WriteLine()
Console.WriteLine("  u     {0}", myDT.ToString("u"))
Console.WriteLine("        {0} {1}", myDTFI.UniversalSortableDateTimePattern, "(UniversalSortableDateTimePattern)")
Console.WriteLine()
Console.WriteLine("  U     {0}", myDT.ToString("U"))
Console.WriteLine()
Console.WriteLine("  y     {0}", myDT.ToString("y"))
Console.WriteLine("        {0} {1}", myDTFI.YearMonthPattern, "(YearMonthPattern)")
Console.WriteLine()
Console.WriteLine("  Y     {0}", myDT.ToString("Y"))
Console.WriteLine("        {0} {1}", myDTFI.YearMonthPattern, "(YearMonthPattern)")
End Sub 'Main
End Class 'SamplesDTFI
'This code produces the following output.
'
'FORMAT  en-US EXAMPLE
'CHAR    VALUE OF ASSOCIATED PROPERTY, IF ANY
'
'  d     1/3/2002
'        M/d/yyyy (ShortDatePattern)
'
'  D     Thursday, January 03, 2002
'        dddd, MMMM dd, yyyy (LongDatePattern)
'
'  f     Thursday, January 03, 2002 12:00 AM
'
'  F     Thursday, January 03, 2002 12:00:00 AM
'        dddd, MMMM dd, yyyy h:mm:ss tt (FullDateTimePattern)
'
'  g     1/3/2002 12:00 AM
'
'  G     1/3/2002 12:00:00 AM
'
'  m     January 03
'        MMMM dd (MonthDayPattern)
'
'  M     January 03
'        MMMM dd (MonthDayPattern)
'
'  r     Thu, 03 Jan 2002 00:00:00 GMT
'        ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (RFC1123Pattern)
'
'  R     Thu, 03 Jan 2002 00:00:00 GMT
'        ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (RFC1123Pattern)
'
'  s     2002-01-03T00:00:00
'        yyyy'-'MM'-'dd'T'HH':'mm':'ss (SortableDateTimePattern)
'
'  t     12:00 AM
'        h:mm tt (ShortTimePattern)
'
'  T     12:00:00 AM
'        h:mm:ss tt (LongTimePattern)
'
'  u     2002-01-03 00:00:00Z
'        yyyy'-'MM'-'dd HH':'mm':'ss'Z' (UniversalSortableDateTimePattern)
'
'  U     Thursday, January 03, 2002 8:00:00 AM
'
'  y     January, 2002
'        MMMM, yyyy (YearMonthPattern)
'
'  Y     January, 2002
'        MMMM, yyyy (YearMonthPattern)
'
[C#]
using System;
using System.Globalization;
public class SamplesDTFI  {
public static void Main()  {
// Creates and initializes a DateTimeFormatInfo associated with the en-US culture.
DateTimeFormatInfo myDTFI = new CultureInfo( "en-US", false ).DateTimeFormat;
// Creates a DateTime with the Gregorian date January 3, 2002 (year=2002, month=1, day=3).
// The Gregorian calendar is the default calendar for the en-US culture.
DateTime myDT = new DateTime( 2002, 1, 3 );
// Displays the format pattern associated with each format character.
Console.WriteLine( "FORMAT  en-US EXAMPLE" );
Console.WriteLine( "CHAR    VALUE OF ASSOCIATED PROPERTY, IF ANYn" );
Console.WriteLine( "  d     {0}", myDT.ToString("d") );
Console.WriteLine( "        {0} {1}n", myDTFI.ShortDatePattern, "(ShortDatePattern)" );
Console.WriteLine( "  D     {0}", myDT.ToString("D") );
Console.WriteLine( "        {0} {1}n", myDTFI.LongDatePattern, "(LongDatePattern)" );
Console.WriteLine( "  f     {0}n", myDT.ToString("f") );
Console.WriteLine( "  F     {0}", myDT.ToString("F") );
Console.WriteLine( "        {0} {1}n", myDTFI.FullDateTimePattern, "(FullDateTimePattern)" );
Console.WriteLine( "  g     {0}n", myDT.ToString("g") );
Console.WriteLine( "  G     {0}n", myDT.ToString("G") );
Console.WriteLine( "  m     {0}", myDT.ToString("m") );
Console.WriteLine( "        {0} {1}n", myDTFI.MonthDayPattern, "(MonthDayPattern)" );
Console.WriteLine( "  M     {0}", myDT.ToString("M") );
Console.WriteLine( "        {0} {1}n", myDTFI.MonthDayPattern, "(MonthDayPattern)" );
Console.WriteLine( "  r     {0}", myDT.ToString("r") );
Console.WriteLine( "        {0} {1}n", myDTFI.RFC1123Pattern, "(RFC1123Pattern)" );
Console.WriteLine( "  R     {0}", myDT.ToString("R") );
Console.WriteLine( "        {0} {1}n", myDTFI.RFC1123Pattern, "(RFC1123Pattern)" );
Console.WriteLine( "  s     {0}", myDT.ToString("s") );
Console.WriteLine( "        {0} {1}n", myDTFI.SortableDateTimePattern, "(SortableDateTimePattern)" );
Console.WriteLine( "  t     {0}", myDT.ToString("t") );
Console.WriteLine( "        {0} {1}n", myDTFI.ShortTimePattern, "(ShortTimePattern)" );
Console.WriteLine( "  T     {0}", myDT.ToString("T") );
Console.WriteLine( "        {0} {1}n", myDTFI.LongTimePattern, "(LongTimePattern)" );
Console.WriteLine( "  u     {0}", myDT.ToString("u") );
Console.WriteLine( "        {0} {1}n", myDTFI.UniversalSortableDateTimePattern, "(UniversalSortableDateTimePattern)" );
Console.WriteLine( "  U     {0}n", myDT.ToString("U") );
Console.WriteLine( "  y     {0}", myDT.ToString("y") );
Console.WriteLine( "        {0} {1}n", myDTFI.YearMonthPattern, "(YearMonthPattern)" );
Console.WriteLine( "  Y     {0}", myDT.ToString("Y") );
Console.WriteLine( "        {0} {1}n", myDTFI.YearMonthPattern, "(YearMonthPattern)" );
}
}
/*
This code produces the following output.
FORMAT  en-US EXAMPLE
CHAR    VALUE OF ASSOCIATED PROPERTY, IF ANY
d     1/3/2002
M/d/yyyy (ShortDatePattern)
D     Thursday, January 03, 2002
dddd, MMMM dd, yyyy (LongDatePattern)
f     Thursday, January 03, 2002 12:00 AM
F     Thursday, January 03, 2002 12:00:00 AM
dddd, MMMM dd, yyyy h:mm:ss tt (FullDateTimePattern)
g     1/3/2002 12:00 AM
G     1/3/2002 12:00:00 AM
m     January 03
MMMM dd (MonthDayPattern)
M     January 03
MMMM dd (MonthDayPattern)
r     Thu, 03 Jan 2002 00:00:00 GMT
ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (RFC1123Pattern)
R     Thu, 03 Jan 2002 00:00:00 GMT
ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (RFC1123Pattern)
s     2002-01-03T00:00:00
yyyy'-'MM'-'dd'T'HH':'mm':'ss (SortableDateTimePattern)
t     12:00 AM
h:mm tt (ShortTimePattern)
T     12:00:00 AM
h:mm:ss tt (LongTimePattern)
u     2002-01-03 00:00:00Z
yyyy'-'MM'-'dd HH':'mm':'ss'Z' (UniversalSortableDateTimePattern)
U     Thursday, January 03, 2002 8:00:00 AM
y     January, 2002
MMMM, yyyy (YearMonthPattern)
Y     January, 2002
MMMM, yyyy (YearMonthPattern)
*/
[C  ]
#using <mscorlib.dll>
using namespace System;
using namespace System::Globalization;
int main()
{
// Creates and initializes a DateTimeFormatInfo associated with the en-US culture.
CultureInfo * MyCI = new CultureInfo(S"en-US", false);
DateTimeFormatInfo* myDTFI = MyCI -> DateTimeFormat;
// Creates a DateTime with the Gregorian date January 3, 2002 (year=2002, month=1, day=3).
// The Gregorian calendar is the default calendar for the en-US culture.
DateTime myDT = DateTime(2002, 1, 3);
// Displays the format pattern associated with each format character.
Console::WriteLine(S"FORMAT  en-US EXAMPLE");
Console::WriteLine(S"CHAR    VALUE OF ASSOCIATED PROPERTY, IF ANYn");
Console::WriteLine(S"  d {0}", myDT.ToString(S"d"));
Console::WriteLine(S" {0} {1}n", myDTFI -> ShortDatePattern, S"(ShortDatePattern)");
Console::WriteLine(S"  D {0}", myDT.ToString(S"D"));
Console::WriteLine(S" {0} {1}n", myDTFI -> LongDatePattern, S"(LongDatePattern)");
Console::WriteLine(S"  f {0}n", myDT.ToString(S"f"));
Console::WriteLine(S"  F {0}", myDT.ToString(S"F"));
Console::WriteLine(S" {0} {1}n", myDTFI -> FullDateTimePattern, S"(FullDateTimePattern)");
Console::WriteLine(S"  g {0}n", myDT.ToString(S"g"));
Console::WriteLine(S"  G {0}n", myDT.ToString(S"G"));
Console::WriteLine(S"  m {0}", myDT.ToString(S"m"));
Console::WriteLine(S" {0} {1}n", myDTFI -> MonthDayPattern, S"(MonthDayPattern)");
Console::WriteLine(S"  M {0}", myDT.ToString(S"M"));
Console::WriteLine(S" {0} {1}n", myDTFI -> MonthDayPattern, S"(MonthDayPattern)");
Console::WriteLine(S"  r {0}", myDT.ToString(S"r"));
Console::WriteLine(S" {0} {1}n", myDTFI -> RFC1123Pattern, S"(RFC1123Pattern)");
Console::WriteLine(S"  R {0}", myDT.ToString(S"R"));
Console::WriteLine(S" {0} {1}n", myDTFI -> RFC1123Pattern, S"(RFC1123Pattern)");
Console::WriteLine(S"  s {0}", myDT.ToString(S"s"));
Console::WriteLine(S" {0} {1}n", myDTFI -> SortableDateTimePattern, S"(SortableDateTimePattern)");
Console::WriteLine(S"  t {0}", myDT.ToString(S"t"));
Console::WriteLine(S" {0} {1}n", myDTFI -> ShortTimePattern, S"(ShortTimePattern)");
Console::WriteLine(S"  T {0}", myDT.ToString(S"T"));
Console::WriteLine(S" {0} {1}n", myDTFI -> LongTimePattern, S"(LongTimePattern)");
Console::WriteLine(S"  u {0}", myDT.ToString(S"u"));
Console::WriteLine(S" {0} {1}n", myDTFI -> UniversalSortableDateTimePattern, S"(UniversalSortableDateTimePattern)");
Console::WriteLine(S"  U {0}n", myDT.ToString(S"U"));
Console::WriteLine(S"  y {0}", myDT.ToString(S"y"));
Console::WriteLine(S" {0} {1}n", myDTFI -> YearMonthPattern, S"(YearMonthPattern)");
Console::WriteLine(S"  Y {0}", myDT.ToString(S"Y"));
Console::WriteLine(S" {0} {1}n", myDTFI -> YearMonthPattern, S"(YearMonthPattern)");
}
/*
This code produces the following output.
FORMAT  en-US EXAMPLE
CHAR    VALUE OF ASSOCIATED PROPERTY, IF ANY
d     1/3/2002
M/d/yyyy (ShortDatePattern)
D     Thursday, January 03, 2002
dddd, MMMM dd, yyyy (LongDatePattern)
f     Thursday, January 03, 2002 12:00 AM
F     Thursday, January 03, 2002 12:00:00 AM
dddd, MMMM dd, yyyy h:mm:ss tt (FullDateTimePattern)
g     1/3/2002 12:00 AM
G     1/3/2002 12:00:00 AM
m     January 03
MMMM dd (MonthDayPattern)
M     January 03
MMMM dd (MonthDayPattern)
r     Thu, 03 Jan 2002 00:00:00 GMT
ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (RFC1123Pattern)
R     Thu, 03 Jan 2002 00:00:00 GMT
ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (RFC1123Pattern)
s     2002-01-03T00:00:00
yyyy'-'MM'-'dd'T'HH':'mm':'ss (SortableDateTimePattern)
t     12:00 AM
h:mm tt (ShortTimePattern)
T     12:00:00 AM
h:mm:ss tt (LongTimePattern)
u     2002-01-03 00:00:00Z
yyyy'-'MM'-'dd HH':'mm':'ss'Z' (UniversalSortableDateTimePattern)
U     Thursday, January 03, 2002 8:00:00 AM
y     January, 2002
MMMM, yyyy (YearMonthPattern)
Y     January, 2002
MMMM, yyyy (YearMonthPattern)
*/

本文由金沙棋牌发布于金沙棋牌官方平台,转载请注明出处:命名空间金沙棋牌官方平台,JavaScript面对国际化

关键词: