Неправильный месяц отображается для июля, когда для культуры установлено значение ar-AE в веб-форме asp.net

Веб-сайт показывает неверный месяц для julyна арабском языке, это арабский веб-сайт, разработанный в веб-форме asp.net, и культура правильно установлена ​​​​на «ar-AE», а дата события показывает правильный месяц на локальном компьютере, но на производстве он отображается месяц, который принадлежит Egyptian culture

Дата в базе данных хранится как smalldatetime в этом формате 2017-07-25 00:00:00

Неправильный месяц для июля

Правильный месяц на локальном хосте :25 يوليو 2017

Неправильный месяц производства: 25 يوليه 2017

<asp:Label  ID="lblDate"  runat="server"  Text='<%# FormatDate(Eval("PublishDate")) %>'>
</asp:Label>

protected string FormatDate(object dt) {
  string date = String.Format("{0:MMMM dd, yyyy}", dt);
  date = String.Format("{0:dd MMMM yyyy}", dt);
  // Response.Write(date + "<br/>");
  return date;
}

Культура установлена ​​​​в ОАЭ правильно

protected override void InitializeCulture() {
  String lang = "ar-AE";
  CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture;
  // Call function to detect Language and assign  to session variable
  Thread.CurrentThread.CurrentCulture = new CultureInfo(lang);
  Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);

  base.InitializeCulture();
}

В чем может быть причина, может ли это быть сам рабочий сервер?

Мы проверяем почти все возможности и перепробовали все, только месяц ошибается на июль, остальное все ок.

Я также перепроверил настройку языка производственного сервера, настройки IIS, все вроде бы в порядке, единственное, что я могу отметить, это то, что на сервере есть все последние обновления, может быть, мы что-то упустили. мы тестировали то же самое на разных машинах с Windows 7, все работает нормально.

Обновление: я также пробовал предлагать решение, но оно продолжает показывать неправильный месяц для يوليه ИЮЛЯ. Это не правильно. Мы протестировали его, также он показывает правильную культуру на сервере.

Пример скрипки также показывает неверный месяц https://dotnetfiddle.net/ZAOJ7H


person Learning    schedule 11.10.2017    source источник
comment
Объект, переданный FormatDate, является DateTime? Дата в базе данных хранится в этом формате Дата никогда не сохраняется в формате в базе данных. Он должен храниться как datetime или date без формата. Если он был сохранен как строка (varchar), вы должны сначала исправить это.   -  person Tim Schmelter    schedule 11.10.2017
comment
Я бы предложил явно использовать перегрузку string.Format, которая принимает CultureInfo как IFormatProvider, или установить культуру в файле Web.config, как описано здесь: forums.asp.net/t/   -  person Martin Costello    schedule 11.10.2017
comment
@MartinCostello: должно быть ненужным. OP уже использует рекомендуемый способ, который должен работать   -  person Tim Schmelter    schedule 11.10.2017
comment
Может быть какая-то тонкость, связанная с потоком, которая не видна из представленного кода, вызывающего разницу, поэтому я предложил это.   -  person Martin Costello    schedule 11.10.2017
comment
@TimSchmelter, объект, который я передаю в FormaDate, это DateTime 2017-07-25 00:00:00   -  person Learning    schedule 11.10.2017
comment
Обновленный вопрос с более подробной информацией для ясности   -  person Learning    schedule 11.10.2017


Ответы (2)


Я попытался найти локализованное название месяца DateTime, используя следующие строки кода:

DateTime dt = DateTime.Parse("2017-07-25 00:00:00");

string arabicMonth = new CultureInfo("ar-AE").DateTimeFormat.GetMonthName(dt.Month);

Полученный код дает يوليه вместо يوليو, указывая на то, что что-то пошло не так в локализации Windows названий месяцев по григорианскому календарю на арабском языке.

Немного выяснив, это вызвано тем, что locale.nls файл, расположенный в %WINDIR%\System32\locale.nls, содержит неверные данные, где июль месяц отображается в другой арабской версии, чем текущая системная культура с использованием.

Поскольку файл NLS отформатирован в двоичном формате, трудно читать и редактировать сохраненную информацию о локали, даже просматривая ее в шестнадцатеричном редакторе. Насколько мне известно, эта проблема уже исправлена ​​Microsoft в обновлении KB981981 для систем Windows 7 и Server 2008 R2, вы можете выполнить обновление в зависимости от используемой платформы (после этого требуется перезагрузка):

Обновление для 32-разрядной версии Windows 7 (KB981981) — 24.05.2010

Обновление для 64-разрядной версии Windows 7 (KB981981) — 24 мая /2010

NB: для достижения наилучших результатов убедитесь, что на всех затронутых компьютерах установлено это обновление. Если вы не можете установить обновление из-за определенных ограничений, я предлагаю попробовать использовать плагин jQuery для datepicker, который показывает يوليو за июль в качестве обходного пути.

PS: я также попробовал решение zahed в скрипке OP -

DateTime.Parse("2017-07-25 00:00:00").ToString("dd dddd , MMMM, yyyy", new CultureInfo("ar-AE"))

Но он также показывает 25 الثلاثاء , يوليه, 2017 (т.е. يوليه), следовательно, это не проблема форматирования строки, а проблема локализации Windows, как описано выше.

Использованная литература:

Описание изменений содержания служб обновления программного обеспечения и служб обновления Windows Server в версии 2010

Как преобразовать название месяца в английском тексте в datetime в арабский текст с помощью C#?

Связанный:

Майкл С. Каплан – арабские локали для названий месяцев

person Tetsuya Yamamoto    schedule 18.10.2017
comment
Я не уверен, что это решение 100, но я уверен, что оно должно что-то делать с ОС или обновлениями. Обновления, на которые вы указываете, очень старые и для Windows 7, в то время как я столкнулся с проблемой в версии Windows Server 2102 R2, а также на скрипке, что насчет этого. В любом случае, я все равно отмечу ваше, так как оно лучше объяснено, но может не соответствовать реальному решению. - person Learning; 24.10.2017

Код дизайна:

<div>
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">LinkButton</asp:LinkButton>
</div>

Код позади С#:

protected void LinkButton1_Click(object sender, EventArgs e)
{
    Label1.Text = DateTime.Parse("2017-07-25 00:00:00").ToString("dd dddd , MMMM, yyyy", new CultureInfo("ar-AE"));
}

Обновленный ответ:

Я бы предположил, что все языки, которые поддерживает ОС (учитывая, что именно оттуда поступает информация).

Вот список: языки, поддерживаемые ОС по умолчанию.

person mohd mazhar khan    schedule 18.10.2017
comment
Какую машину вы тестировали на ОС, версию, так как она работает у нас также на двух локальных машинах с Windows 7, но не на версии Windows 2012 R2. даже скрипки также генерируют неправильное название месяца dotnetfiddle.net/ZAOJ7H - person Learning; 24.10.2017
comment
Можете ли вы сказать мне версию Windows на рабочем сервере? Я обновлю вам ответ. @Обучение - person mohd mazhar khan; 24.10.2017
comment
Пожалуйста, проверьте мой обновленный ответ, который поможет решить вашу проблему. @Обучение - person mohd mazhar khan; 24.10.2017