2011-09-14 7 views
4

ウェブアプリケーション全体の日付フォーマットを 'YYYY-MM-DD'に設定したいと思います。私はCultureAndRegionInfoBuilderのオブジェクトを作成し、それを登録することでこれを行うことができます。しかし、私のアプリケーションはというホストされた環境上にあるので、私は実行可能ファイルを実行してそのカルチャを登録することはできません。現在のカルチャーのデータフォーマットを変更してウェブアプリケーション全体に適用する方法

Application_Startの中でこれを行う方法が必要なので、ウェブアプリケーション全体に適用されます。

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

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

編集:インテリセンスが取得または設定などの特性を示しながら、私は、@doitgoodの提案に、以下を試してみましたが、例外System.InvalidOperationException: Instance is read-only.を得ました。

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"; 

私は同じ例外を取得「インスタンスは読み取り専用です」。

答えて

2

application_startでこれを行うと、アプリケーションを開始したスレッドのみが有効になります。

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

2

あなたはコードをglobal.asax Application_BeginRequestイベントに挿入し、適切なThread.CurrentThread.CurrentUICultureThread.CurrentThread.CurrentCultureイベントを更新しますか?

3

例外:System.InvalidOperationException:インスタンスが読み取り専用です。intellisenseはプロパティを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; 
5

Sebetoによって答えが正解です。私は同じ問題を抱えていて、私はそれを試しました。私はもう少し説明を加えたいと思った。現在の文化のプロパティは、いったん読み込まれると、実際の文化が設定された後は、実際には読み取り専用になります。したがって、新しい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の例によれば、あなたも、Page_Loadの上の現在のカルチャを変更することができhttp://support.microsoft.com/kb/306162参照してください。 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; 

} 

は、すべての要求のいずれかですべてのページのinitを、現在のスレッドの文化を交換するための最良のアイデアですか?私はそれに重点を置くために十分なデータがありませんが、それはうまく動作するようです:)。

関連する問題