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

この答えを見てください。また、それは助けになるかもしれません。基本的な考え方は、数字を東アラビア語の対応する数字に置き換える拡張メソッドを作成することです。ところで。ps-AFカルチャには、数字と月/日の名前の両方がすでに定義されているようです。

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

それがあなたにふさわしいかどうかはわかりません。

于 2011-04-10T19:03:20.843 に答える
3
  1. 実装の詳細に依存しているリフレクションを使用しています。これらの詳細は、.NET 3.5 と .NET 4 の間で変更されている可能性があります。そうしないでください。API 設計者がそれらをいじってほしければ、それらを公開したはずです。このような実装の詳細に依存するときはいつでも、実装を変更するときに潜在的な破損を予期する必要があります。

  2. 全体のクローンを作成しCultureInfo、 と を変更してみNumberFormatInfoましたDateTimeFormatInfoか? 自分でやったことがあるとは言えませんが、試してみる価値はあります。

于 2011-04-10T11:25:47.560 に答える
1

コメントされた行がVS2010(.NET 4.0)でエラーになるのに、VS2008(.NET 3.5)では問題ないのはなぜですか?

物事は変わります。何かが起こります。人生は続く。 〜エリザベススコット

DateTimeを使用するときに数字をローカライズするにはどうすればよいですか。つまり、自分の言語(Just For 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 に答える