不同机器上相同文化的不同 DateTimeFormat

发布于 2024-10-28 00:14:26 字数 860 浏览 6 评论 0原文

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

在我的开发计算机(安装了 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;

有什么想法吗?

谢谢。

I'm having a problem when I deploy my web application in different servers. There seems to be an inconsistency in some DateTimeFormat patterns, like ShortDatePattern, using the same culture (pt-BR).

In my development machine (Windows 7, .NET 4 installed, application targeting .NET 3.5) and a Windows Server 2008 R2 (with the application targeting .NET 4) server the ShortDatePattern is "dd/MM/yyyy" - which is the correct, I guess.

In the production server (Windows Server 2003, using .NET 3.5) it is "d/M/yyyy". It is causing me tons of trouble.

I could solve the issue by setting the patterns by hand, but I'd really like to avoid doing this every time I need to output a date. Specially since this will be non-trivial in many places (like where I use MVC's Html.TextBoxFor) and will require a good amount of rewriting.

If there's a way of changing the patterns for the entire web application in one place it would be great. I've tried the following approach in the Global.asax.cs file, with no success:

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

Any ideas?

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

再见回来 2024-11-04 00:14:26

实际上,我试图在 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;
}

Actually, I was trying to use the code above in the wrong place in the Global.asax file.

I managed to override the ShortDatePattern for the entire aplication by putting the code in the Application_BeginRequest method:

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;
}
迎风吟唱 2024-11-04 00:14:26

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

CultureInfo(string name, bool useUserOverride)

并为 useUserOverride 参数传递 false

来自 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: /

The solution is to always create CultureInfo object using the constructor:

CultureInfo(string name, bool useUserOverride)

and passing false for useUserOverride parameter.

From MSDN:

useUserOverride: A Boolean that denotes whether to use the user-selected culture
settings (true) or the default culture settings (false).

Basically using false force the CultureInfo to use the default settings (separators, ...) from the specified culture instead of using the one defined in the system.

Consider also that different operating system can produce different results in some (small) cases.
Running the code below (.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();

On Win 7 produce:

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

while running it on Win 8 produce:

29/10/2013 15.08.43
Time Separator: .
Date Separaotr: /
像极了他 2024-11-04 00:14:26

在控制面板中转到区域和语言选项,选择葡萄牙语(巴西),在格式中转到自定义此格式,检查日期配置在此处输入图像描述

in control panel go to regional and language options,select portuges(brazil), in formats go to customize this format, check the date configurationenter image description here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文