如何更改当前区域性的数据格式,以便它应用于整个Web应用程序

时间:2011-09-14 08:02:15

标签: asp.net globalization date-formatting

我想为我的整个网络应用程序将日期格式设置为“ YYYY-MM-DD ”。我可以通过创建CultureAndRegionInfoBuilder的对象然后注册它来完成此操作。但由于我的应用程序位于托管环境,我无法运行可执行文件来注册文化。

我需要一种方法在Application_Start中执行此操作,以便它适用于整个网络应用。

我尝试使用Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern更改日期格式,但似乎没有将更改传播到整个应用程序。

简而言之,我需要一种方法来从Web应用程序本身以编程方式更改整个Web应用程序的当前文化设置。

修改:我在@doitgood的建议上尝试了以下操作,但异常System.InvalidOperationException: Instance is read-only.,而intellisense将该属性显示为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 个答案:

答案 0 :(得分: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;

还有一个问题是 where 来放置代码来改变当前线程的文化。

根据微软的例子,请参阅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;

}

最好的想法是将当前Thread的文化与每个页面初始化的每个请求交换出来吗?我没有足够的数据来衡量它,但似乎工作正常:)。

答案 1 :(得分:3)

  

异常'System.InvalidOperationException:Instance是只读的',而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;

答案 2 :(得分:2)

如果在application_start上执行此操作,则只会启动启动应用程序的线程。

您需要确保每次请求都发生更改 - HttpModule为每个请求设置此更改可能是最干净的解决方案。

答案 3 :(得分:2)

您是否可以将代码放入global.asax Application_BeginRequest事件并更新相应的Thread.CurrentThread.CurrentUICultureThread.CurrentThread.CurrentCulture