5

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

我需要一种方法来做到这一点,Application_Start以便它适用于整个网络应用程序。

我尝试使用 更改日期格式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

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 的示例,请参阅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: Instance is read-only.”,而智能感知将属性显示为 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

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

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

于 2011-09-14T08:06:44.933 回答
2

您不能将您的代码放入 global.asaxApplication_BeginRequest事件并更新适当Thread.CurrentThread.CurrentUICultureThread.CurrentThread.CurrentCulture吗?

于 2011-09-14T08:54:12.787 回答