不同DateTimeFormat用于不同机器中的相同文化

时间:2011-03-31 20:02:04

标签: asp.net datetime cultureinfo

我在不同服务器中部署Web应用程序时遇到问题。某些DateTimeFormat模式似乎存在不一致,例如ShortDatePattern,使用相同的文化(pt-BR)。

在我的开发机器(安装了Windows 7,安装了.NET 4,面向.NET 3.5的应用程序)和Windows Server 2008 R2(面向.NET 4的应用程序)服务器上,ShortDatePattern为"dd/MM/yyyy" - 这是我猜错了。

在生产服务器(Windows Server 2003,使用.NET 3.5)中,它是"d/M/yyyy"。这给我带来了很多麻烦。

我可以通过手动设置模式来解决问题,但我真的希望每次需要输出日期时都这样做。特别是因为这在许多地方都是非常重要的(比如我使用MVC的Html.TextBoxFor)并且需要大量的重写。

如果有办法在一个地方更改整个Web应用程序的模式,那就太棒了。我在Global.asax.cs文件中尝试了以下方法,但没有成功:

CultureInfo info = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());
info.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
System.Threading.Thread.CurrentThread.CurrentCulture = info;

有什么想法吗?

谢谢。

3 个答案:

答案 0 :(得分:3)

实际上,我试图在Global.asax文件的错误位置使用上面的代码。

我设法通过将代码放在Application_BeginRequest方法中来覆盖整个应用程序的ShortDatePattern:

protected void Application_BeginRequest()
{
    CultureInfo info = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());
    info.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
    System.Threading.Thread.CurrentThread.CurrentCulture = info;
}

答案 1 :(得分:2)

解决方案是始终使用构造函数创建CultureInfo对象:

CultureInfo(string name, bool useUserOverride)

并传递false useUserOverride参数。

来自MSDN:

  

useUserOverride:一个布尔值,表示是否使用用户选择的区域性   设置(true)或默认文化设置(false)。

基本上使用false强制CultureInfo使用指定区域性的默认设置(分隔符,...),而不是使用系统中定义的默认设置。

还要考虑不同的操作系统在某些(小)情况下可以产生不同的结果。 运行下面的代码(.NET 4.5):

CultureInfo ci = new CultureInfo("it-IT", false);

String date = DateTime.Now.ToString(ci);
Console.WriteLine(date);
Console.WriteLine("Time Separator: " + ci.DateTimeFormat.TimeSeparator);
Console.WriteLine("Date Separaotr: " + ci.DateTimeFormat.DateSeparator);
Console.ReadKey();

在Win 7上产生:

29/10/2013 14:12:33
Time Separator: :
Date Separaotr: /

在Win 8上运行时生成:

29/10/2013 15.08.43
Time Separator: .
Date Separaotr: /

答案 2 :(得分:0)

在控制面板中转到区域和语言选项,选择portuges(巴西),格式为自定义此格式,检查日期配置enter image description here