我想大家对DateTime.ToString()方法的用法肯定已经非常熟悉了,但我想大家用过的大部分用法都是:DateTime.ToString(“format”),不过本文想讲述的是它的另一个重载方法DateTime.ToString("format",IFormatProvider)。
如果大家做的项目中有多语言的需求的话,那么肯定少不了会有的功能要显示一个时间,由于文差异域每种语言用户对时间格式的需求肯定是不一样的,比如英文中的时间格式是:12/2/2013 8:20:22 PM,而德语的格式是:02.12.2013 20:20:22;这个区别还是很大的,而且如果语言种数多的话,也很难对每种特定语言的时间格式作特定的处理,而且也不利于程序的扩展性。不过万幸的是微软给我们提供了CultureInfo这个类,同时这个类继承了IFormatProvider这个接口,所以我们可以利用它来得到我们想要的时间格式(其它格式也可以通过它来获取,比哪货币等)。
闲话不多说,直接看代码:
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-cn"); DateTime dt = Convert.ToDateTime("2013-12-2 20:20:22"); Console.WriteLine("当前语言:" + Thread.CurrentThread.CurrentCulture.DisplayName); Console.WriteLine("日期:2013-12-2 20:20:22"); Console.WriteLine("d-短日期模式: " + dt.ToString("d", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("D-长日期模式: " + dt.ToString("D", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("f-完整日期/时间模式(短时间): " + dt.ToString("f", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("F-完整日期/时间模式(长时间): " + dt.ToString("F", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("g-常规日期/时间模式(短时间): " + dt.ToString("g", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("G-常规日期/时间模式(长时间): " + dt.ToString("G", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("m-月日模式(m): " + dt.ToString("m", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("M-月日模式(M): " + dt.ToString("M", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("o-往返日期/时间模式: " + dt.ToString("o", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("R-RFC1123 模式: " + dt.ToString("R", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("s-可排序的日期/时间模式;符合 ISO 8601: " + dt.ToString("s", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("t-短时间模式: " + dt.ToString("t", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("T-长时间模式: " + dt.ToString("T", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("u-通用的可排序日期/时间模式: " + dt.ToString("u", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("U-通用的可排序日期/时间模式: " + dt.ToString("U", Thread.CurrentThread.CurrentCulture)); Console.WriteLine("Y-年月模式: " + dt.ToString("Y", Thread.CurrentThread.CurrentCulture)); Console.WriteLine(dt.ToString("yyyyMMdd")); Console.ReadLine();</div>
在实际应用中,我们可以把第一行的“de-de“换成用户切换的语言,然后通过设置当前的线程语言为当前语言种类,那么我们就可以在程序的任一位置通过”Thread.CurrentThread.CurrentCulture”来获得。以前运行结果对比如下:
从结果可以知道,如果想通过CultureInfo来得到不同的语言格式,那么就不能用"yyyyMMdd","yyyy-MM-dd"等这种自定义格式。
附:得到货币格式的写法为:decimal d = 123659.256M; d.ToString("c", Thread.CurrentThread.CurrentCulture.NumberFormat);
关于CultureInfo 类
CultureInfo 类保存区域性特定的信息,如关联的语言、子语言、国家/地区、日历和区域性约定。此类还提供对 DateTimeFormatInfo、NumberFormatInfo、CompareInfo 和 TextInfo 的区域性特定实例的访问。这些对象包含区域性特定操作(如大小写、格式化日期和数字以及比较字符串)所需的信息。
区域性名称和标识符
区域性名称遵循 RFC 1766 标准,格式为“<languagecode2>-<country/regioncode2>”,其中 <languagecode2> 是从 ISO 639-1 派生的由两个小写字母构成的代码,<country/regioncode2> 是从 ISO 3166 派生的由两个大写字母构成的代码。例如,美国英语为“en-US”。在双字母语言代码不可用的情况中,将使用从 ISO 639-2 派生的三字母代码;例如,三字母代码“div”用于使用 Dhivehi 语言的区域。某些区域性名称带有指定书写符号的后缀;例如“-Cyrl”指定西里尔语书写符号,“-Latn”指定拉丁语书写符号。
System.Globalization 命名空间中的此类和其他类接受并使用下列预定义的区域性名称和标识符。
区域性名称 |
区域性标识符 |
语言-国家/地区 |
---|---|---|
""(空字符串) |
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 |
您可能想查找下面的文章:文章分类 |