在C#/.NET中如何在其他语言环境下格式化数字和日期

7
在我编写的应用程序中,我希望显示当前日期和时间,使用英语以及其他语言环境。例如俄语、阿拉伯语和中文。
// DateTime.ToLongDateString doesn't support a IFormatProvider parameter
DateTime.Now.ToString("dddd, d MMMM, yyyy", new CultureInfo("en-US"));
// "Wednesday, 7 August, 2013"

DateTime.Now.ToString("dddd, d MMMM, yyyy 'r.'", new CultureInfo("ru-RU"));
// "среда, 7 августа, 2013 r."

运行良好...

DateTime.Now.ToString("dddd٫ d MMM٫ yyyy", new CultureInfo("ar"));
// "الأربعاء٬ 30 رمضان٬ 1434"

看起来很正常。

但是... 我想显示数字时使用(东方)阿拉伯数字,而不是拉丁/阿拉伯数字。虽然这可以通过进行简单的替换 ('٠‎' 为 '0',1 为 '١' 等等) 来解决。

但是接下来还有中文:

DateTime.Now.ToString("yyyy年M月d日dddd", new CultureInfo("zh-CN"))
// "2013年8月7日星期三"
中文数字似乎比简单的替换复杂得多,有时一个字符会变成两个字符。此外,格式化日期似乎显示的是当前公历日期,而不是当前中国日期
所以我的问题是:
A).NET/C#是否有本地化功能来在其他数字系统中显示数字(特别是日期)?
B)我能否强制.NET/C#使用中国(可能还有日本和其他)日历来显示日期,就像它使用阿拉伯日历一样?

(new CultureInfo("zh-CN")).Calendar 是公历,你可能需要一个自定义的 CultureInfo。 - H H
2
数字替换的工作方式如下:(1)各种ToString函数返回标准(0-9)数字;(2)在启用数字替换的主机中显示字符串时(例如,在WPF窗口中),数字会透明地以国家脚本显示给您(但线程的文化必须设置为国家文化),请参见此问题;(3)目前此功能仅适用于阿拉伯语、印地语和泰语,因此没有自动使用中国古典数字的方法。 - Vlad
2个回答

1

使用ToLongDateString()玩耍

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("zh-CN");
var myDate = DateTime.Now.ToLongDateString();

myDate的值为:2013年8月7日


不要忘记保存之前的文化,并在之后将其放回,否则可能会发生奇怪的事情... :) - Amy

0

1
我似乎无法让它工作 :(CultureInfo Arabic = new CultureInfo("ar"); Arabic.NumberFormat.DigitSubstitution = DigitShapes.NativeNational; DateTime.Now.ToString("dddd٬ d MMM٬ yyyy", Arabic); // "الأربعاء٬ 30 رمضان٬ 1434"奇怪的是: string.Format(Arabic, "{0}", 1); "1" - Amy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接