Разный DateTimeFormat для одной и той же культуры на разных машинах

У меня проблема, когда я развертываю свое веб-приложение на разных серверах. Кажется, существует несоответствие в некоторых шаблонах 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) и потребует большого количества переписывания.

Если есть способ изменить шаблоны для всего веб-приложения в одном месте, это было бы здорово. Я пробовал следующий подход в файле 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;

Любые идеи?

Спасибо.


person rafasoares    schedule 31.03.2011    source источник


Ответы (3)


На самом деле, я пытался использовать приведенный выше код не в том месте в файле Global.asax.

Мне удалось переопределить ShortDatePattern для всего приложения, поместив код в метод Application_BeginRequest:

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;
}
person rafasoares    schedule 02.04.2011

Решение состоит в том, чтобы всегда создавать объект 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: /
person Davide Icardi    schedule 15.04.2014

в панели управления перейдите к региональным и языковым параметрам, выберите португальский (Бразилия), в форматах перейдите, чтобы настроить этот формат, проверьте конфигурацию датывведите здесь описание изображения.

person vaquito    schedule 31.03.2011
comment
Хотя это решило бы это на моей машине, я не могу изменить форматы на сервере. - person rafasoares; 02.04.2011