5

Web アプリケーション全体の日付形式を ' YYYY-MM-DD 'に設定したいと考えています。のオブジェクトを作成してCultureAndRegionInfoBuilderから登録することで、これを行うことができます。しかし、私のアプリケーションはホストされた環境にあるため、実行可能ファイルを実行してカルチャを登録することはできません。

Application_StartWeb アプリ全体に適用されるように、内でこれを行う方法が必要です。

を使用して日付形式を変更しようとしThread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePatternましたが、アプリケーション全体に変更が反映されていないようです。

要するに、Web アプリケーション全体の現在のカルチャ設定を Web アプリ自体からプログラムで変更する方法が必要です。

編集: @doitgoodの提案で次のことを試しましたが、例外が発生System.InvalidOperationException: Instance is read-only.しましたが、インテリセンスはプロパティをGetまたはSetとして表示します。

void Application_BeginRequest(object sender, EventArgs e)
{
    Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";   
}

変更をアプリケーションに対してグローバルにするために、次のことを試しましたApplication_Start

System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";

「インスタンスは読み取り専用です」という同じ例外が発生します。

4

4 に答える 4

5

セベトの答えは正しい。私は同じ問題を抱えていたので、試してみました。もう少し説明を加えようと思いました。現在のカルチャが設定されると、現在のカルチャのプロパティは実際には読み取り専用になります。したがって、新しい CultureInfo オブジェクトを構築する必要があります (最も簡単な方法は、既存のカルチャを複製することです)。次に、現在のスレッドのカルチャ オブジェクトを独自のカルチャ オブジェクトと交換する前に、カルチャ情報オブジェクトのプロパティを微調整できます。

CultureInfo newCultureDefinition = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
//make percentages n% instead of n % .ToString("p") adds a space by default english culture in asp.net
newCultureDefinition.NumberFormat.PercentPositivePattern = 1;
newCultureDefinition.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
Thread.CurrentThread.CurrentCulture = newCultureDefinition;

また、現在のスレッドのカルチャを変更するコードをどこに配置するかという問題もあります。

Microsoft の例によると、http://support.microsoft.com/kb/306162を参照してください。Page_Load で現在のカルチャを変更することもできます。Page_Load の前に書式設定が必要なコードがあるかもしれないので、ベース ページの OnInit に変更を加えました。

protected override void OnInit(EventArgs e)
{
        initGlobalCulturalFormattingChanges();
}

そしてそれを締めくくる:

private void initGlobalCulturalFormattingChanges()
{

    CultureInfo newCultureDefinition = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
    //make percentages n% instead of n % (.ToString("p0") adds a space by default in asp.net
    newCultureDefinition.NumberFormat.PercentPositivePattern = 1;
    newCultureDefinition.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
    Thread.CurrentThread.CurrentCulture = newCultureDefinition;

}

現在のスレッドのカルチャをすべてのページの初期化ごとにすべてのリクエストで交換するのが最善のアイデアですか? それを検討するのに十分なデータはありませんが、うまくいくようです:)。

于 2012-09-10T21:05:43.693 に答える
3

例外 'System.InvalidOperationException: インスタンスは読み取り専用です。' が発生しましたが、インテリセンスではプロパティが Get または Set として表示されます。

Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern ="yyyy-MM-dd";

Thread.CurrentThread.CurrentCulture の内容を直接変更することはできないようです。同じ問題が発生しました。

しかし、次のようにできます。

CultureInfo TempCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
TempCulture.DateTimeFormat.ShortDatePattern ="yyyy-MM-dd";
Thread.CurrentThread.CurrentCulture = TempCulture;
于 2011-10-05T06:07:09.747 に答える
2

コードをglobal.asaxApplication_BeginRequestイベントに入れて、適切Thread.CurrentThread.CurrentUICultureに更新することはできませThread.CurrentThread.CurrentCultureんか?

于 2011-09-14T08:54:12.787 に答える
2

でこれを行うapplication_startと、アプリケーションを開始したスレッドのみが影響を受けます。

すべてのリクエストで変更が行われるようにする必要があります-すべてのリクエストHttpModuleに対してこれを設定するのがおそらく最もクリーンなソリューションです。

于 2011-09-14T08:06:44.933 に答える