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

Pra*_*eep 5 asp.net globalization date-formatting

我想为我的整个Web应用程序设置日期格式为' YYYY-MM-DD '.我可以通过创建一个对象CultureAndRegionInfoBuilder然后注册它来做到这一点.但由于我的应用程序是在托管环境中,我无法运行可执行文件来注册文化.

我需要一种方法来实现这一点,Application_Start以便它适用于整个Web应用程序.

我尝试使用更改日期格式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";   
}
Run Code Online (Sandbox Code Playgroud)

为了使更改成为应用程序的全局变化,我尝试了以下方法Application_Start:

System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
Run Code Online (Sandbox Code Playgroud)

我得到了相同的异常'Instance是只读的'.

Ada*_*amE 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;
Run Code Online (Sandbox Code Playgroud)

还有一个问题是在何处放置代码来改变当前线程的文化.

根据Microsoft的示例,请参阅http://support.microsoft.com/kb/306162,您甚至可以更改Page_Load上的当前文化.由于您可能在Page_Load之前需要格式化代码,因此我将更改放在我的基页OnInit中.

protected override void OnInit(EventArgs e)
{
        initGlobalCulturalFormattingChanges();
}
Run Code Online (Sandbox Code Playgroud)

封顶:

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;

}
Run Code Online (Sandbox Code Playgroud)

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


Ode*_*ded 2

如果您在 上执行此操作application_start,则只有启动应用程序的线程才会受到影响。

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