1

我使用System.Globalization如下:

CultureInfo calture = new CultureInfo(MyCultureInfoGoesHere);
DateTimeFormatInfo info = calture.DateTimeFormat;
info.AbbreviatedDayNames = new string[] { "bla", "bla", "bla", "bla", "bla", "bla", "bla" };
info.ShortestDayNames = new string[] { "bla", "bla", "bla", "bla", "bla", "bla", "bla" };
info.DayNames = new string[] { "bla", "bla", "bla", "bla", "bla", "bla", "bla" };
info.AbbreviatedMonthNames = new string[] { "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "" };
info.MonthNames = new string[] { "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "" };
info.AMDesignator = "bla";
info.PMDesignator = "bla";
info.ShortDatePattern = "yyyy/MM/dd";
//info.ShortDatePattern = "dd/MM/yyyy";
info.LongDatePattern = "dddd , dd MMMM yyyy";
info.FirstDayOfWeek = DayOfWeek.bla;
MyCalendar cal = new MyCalendar();
typeof(DateTimeFormatInfo).GetField("calendar", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic).SetValue(info, cal);
//object obj = typeof(DateTimeFormatInfo).GetField("m_cultureTableRecord", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic).GetValue(info);
//obj.GetType().GetMethod("UseCurrentCalendar", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(obj, new object[] { cal.GetType().GetProperty("ID", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(cal, null) });
typeof(System.Globalization.CultureInfo).GetField("calendar", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic).SetValue(calture, cal);
Thread.CurrentThread.CurrentCulture = calture;
Thread.CurrentThread.CurrentUICulture = calture;
CultureInfo.CurrentCulture.DateTimeFormat = info;
CultureInfo.CurrentUICulture.DateTimeFormat = info;

我的问题是:

  1. 为什么注释行在 VS2010 (.NET 4.0) 中有错误,但在 VS2008 (.NET 3.5) 中没问题?

  2. 使用时如何本地化我的数字DateTime.Now,我的意思是我想要我的语言中的数字格式(仅适用于 DateTime)!是否可以?

提前致谢并致以最诚挚的问候。

4

3 回答 3

3
  1. 您正在使用反射,它依赖于实现细节。这些细节很可能在 .NET 3.5 和 .NET 4 之间发生了变化。不要那样做。如果 API 设计者想让你弄乱这些东西,他们就会把它们公开。每当您依赖这样的实现细节时,您都应该预料到在更改实现时可能会出现损坏。

  2. 您是否尝试过克隆整体CultureInfo,并修改NumberFormatInfo以及DateTimeFormatInfo?我不能说我自己曾经做过,但值得一试。

于 2011-04-10T11:25:47.560 回答
3

请看一下这个答案。还有一个可能会有所帮助。基本思想是创建一个扩展方法,将数字替换为东阿拉伯数字。顺便提一句。似乎已经为 ps-AF 文化定义了数字和一些月/日名称:

        // gets Eastern Arabic digits array
        string[] numerals = CultureInfo.CreateSpecificCulture("ps-AF").NumberFormat.NativeDigits;

我只是不知道它是否适合你。

于 2011-04-10T19:03:20.843 回答
1

为什么注释行在 VS2010 (.NET 4.0) 中有错误,但在 VS2008 (.NET 3.5) 中没问题?

事情会改变的。事情发生了。生活仍在继续。 〜伊丽莎白斯科特

当我使用 DateTime 时如何本地化我的数字。现在,我的意思是我想要我的语言中的数字格式(仅适用于 DateTime)!是否可以?尽管 C# 已经包含大量默认值,但您可以根据自己的喜好微调它们。

这是有关如何设置日期时间信息的示例。

现在如果你要打印出来DateTime.Now

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false);
Console.WriteLine(DateTime.Now.ToString("D", CultureInfo.CurrentCulture));
Thread.CurrentThread.CurrentCulture = new CultureInfo("et")
{
    DateTimeFormat = { LongDatePattern = "d. MMMM yyyy'. a.'" }
}; 
Console.WriteLine(DateTime.Now.ToString("D", CultureInfo.CurrentCulture));

你会得到:

Sunday, April 10, 2011
10. aprill 2011. a.

我想,这就是你想要的——通过改变文化来获得不同的时间格式。

于 2011-04-10T17:28:05.090 回答