Где системная локаль/культура установлена для .NET

У меня есть проблема с c# блоком (.net 2.0 записанная Visual Studio использования 2005), который установлен на британском сервере и должен использовать британские региональные настройки.

То, что делает мой код, должно преобразовать дату в форме dd/MM/yyyy в UTC т.е. yyyy-mm-dd. Проблема возникла с датами как 16.02.2010, где компонент не удался преобразовать дату и возвратил Ошибку. После отладки я понял что, по странной причине, CultureInfo, возвращенный Системой. CultureInfo являются en-США.

Я могу программно изменить те настройки использование:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB", false); 

и мой код хорошо работает.

Однако я не хочу делать это все время, когда моя система должна быть британской. Не США. Так, как я изменяю культуру по умолчанию для платформы .NET, чтобы быть en-ГБ по умолчанию вместо en-США?

Для получения информации:

  • Я попытался обновить machine.config файл и указать culture=en-GB для раздела глобализации (он был установлен на нейтральный), но он не работает, любой [сделал это для 1,1 и 2.0], но возможно, что я не изменил его правильно.
  • Я проверил свои региональные настройки окон, и они - определенно установка в Великобританию с датами как dd/MM/yyyy
  • Я работаю в Виртуальном сервере и проверил свою хост-систему. Это также установлено на Великобританию

Править:

Немного дополнительной детали о контексте. Рассматриваемый блок называют через взаимодействующий с COM от собственного стороннего компонента C++, который работает как приложение COM +.

9
задан Powerlord 18 February 2010 в 22:23
поделиться

7 ответов

Вам не нужно менять CurrentCulture, чтобы выполнить преобразование. Если вы уверены, что дата имеет форму "dd/MM/yyyy", вы можете использовать

DateTime dtTemp = DateTime.ParseExact(dateString, "dd/MM/yyyy", null) // in order not to have to specify a FormatProvider

и затем использовать

dtTemp.ToString("yyyy-MM-dd")

Таким образом, у вас не возникнет проблем независимо от того, какова CurrentCulture. Однако, если вы не уверены, что Дата имеет форму "dd/MM/yyyy", а основана на формате короткой даты CurrentCulture, то вам следует использовать

DateTime dtTemp = DateTime(dateString, CurrentCulture.DateTimeFormat.ShortDatePattern, CurrentCulture.DateTimeFormat);
1
ответ дан 4 December 2019 в 11:41
поделиться

Я считаю, что это представлено System.Globalization.CultureInfo.InstalledUICulture, так что, если ничего другого, возможно, вы можете скопировать это в текущую культуру потока. Я удивлен, что вы обнаружили случай, когда культура потоков отличается от установленной культуры. Возможно, ваш код работает в процессе, который изменил культуру?

Возможно, учетная запись, в которой запущен код, имеет региональные настройки, отличные от настроек системы по умолчанию. Вы это проверили?

2
ответ дан 4 December 2019 в 11:41
поделиться

Сервер настроен неправильно. Панель управления + регион и язык, вкладка «Местоположение». Изменить это может быть немного сложно. Сервер вполне мог быть неправильно настроен специально. Прежде чем что-либо делать, сначала поговорите с администратором сервера.

Ваш запасной план заключается в использовании перегрузки метода DateTime.TryParse (), который принимает аргумент IFormatProvider. Передайте CultureInfo.GetCultureInfo ("en-gb"). DateTimeFormat.

5
ответ дан 4 December 2019 в 11:41
поделиться

Чтобы установить язык и региональные параметры пользовательского интерфейса для всех страниц, добавьте раздел глобализации в файл Web.config, а затем установите атрибуты uiculture и culture, как показано в следующем примере:

4
ответ дан 4 December 2019 в 11:41
поделиться

Хммм, согласно API Docs :

Когда поток запускается, его культура изначально определяется с помощью GetUserDefaultLCID из Windows API.

Этот метод получает локаль из (как следует из названия) локали пользователя по умолчанию, которая, как я полагаю, находится в Панели управления. ПРИМЕЧАНИЕ : Это НЕ то же самое, что и языковой стандарт пользовательского интерфейса.

3
ответ дан 4 December 2019 в 11:41
поделиться

спасибо за ваши ответы (Энди разместил вопрос от моего имени). Это действительно была проблема с региональными настройками, но ни с пользователем, под которым я был подключен, ни с пользователем, под которым был запущен процесс. Это было бы слишком просто. Похоже, что пользователь по умолчанию все еще был en-US. Я сделал сброс, нажав на флажок "Применить настройки к текущему пользователю и пользователю по умолчанию..." на вкладке "Дополнительно" и перезагрузив сервер. System.Globalization.CultureInfo теперь возвращает {en-GB}. И MyDate.ToString(yyyy-mm-dd) работает нормально независимо от того, передается ли дата в виде dd/MM/yyyy или dd-MM-yyy или yyy-MM-dd без необходимости разбора.

Тем не менее, большое спасибо всем за ваши предложения (ParseExact и т.д.), которые действительно сработали. Они будут очень полезны для других форматов дат, которые я не смог обработать красивым способом (yyyyMMdd).

Marc

3
ответ дан 4 December 2019 в 11:41
поделиться

Сборки в .NET Framework не зависят от культуры.

В какой код вы пытаетесь преобразовать дату? Если вы используете Parse или TryParse , попробуйте указать аргумент культуры, чтобы он понял Дата.

0
ответ дан 4 December 2019 в 11:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: