У меня есть проблема с 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-США?
Для получения информации:
Править:
Немного дополнительной детали о контексте. Рассматриваемый блок называют через взаимодействующий с COM от собственного стороннего компонента C++, который работает как приложение COM +.
Вам не нужно менять 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);
Я считаю, что это представлено System.Globalization.CultureInfo.InstalledUICulture, так что, если ничего другого, возможно, вы можете скопировать это в текущую культуру потока. Я удивлен, что вы обнаружили случай, когда культура потоков отличается от установленной культуры. Возможно, ваш код работает в процессе, который изменил культуру?
Возможно, учетная запись, в которой запущен код, имеет региональные настройки, отличные от настроек системы по умолчанию. Вы это проверили?
Сервер настроен неправильно. Панель управления + регион и язык, вкладка «Местоположение». Изменить это может быть немного сложно. Сервер вполне мог быть неправильно настроен специально. Прежде чем что-либо делать, сначала поговорите с администратором сервера.
Ваш запасной план заключается в использовании перегрузки метода DateTime.TryParse (), который принимает аргумент IFormatProvider. Передайте CultureInfo.GetCultureInfo ("en-gb"). DateTimeFormat.
Чтобы установить язык и региональные параметры пользовательского интерфейса для всех страниц, добавьте раздел глобализации в файл Web.config, а затем установите атрибуты uiculture и culture, как показано в следующем примере:
Хммм, согласно API Docs :
Когда поток запускается, его культура изначально определяется с помощью
GetUserDefaultLCID
из Windows API.
Этот метод получает локаль из (как следует из названия) локали пользователя по умолчанию, которая, как я полагаю, находится в Панели управления. ПРИМЕЧАНИЕ : Это НЕ то же самое, что и языковой стандарт пользовательского интерфейса.
спасибо за ваши ответы (Энди разместил вопрос от моего имени). Это действительно была проблема с региональными настройками, но ни с пользователем, под которым я был подключен, ни с пользователем, под которым был запущен процесс. Это было бы слишком просто. Похоже, что пользователь по умолчанию все еще был en-US. Я сделал сброс, нажав на флажок "Применить настройки к текущему пользователю и пользователю по умолчанию..." на вкладке "Дополнительно" и перезагрузив сервер. System.Globalization.CultureInfo теперь возвращает {en-GB}. И MyDate.ToString(yyyy-mm-dd) работает нормально независимо от того, передается ли дата в виде dd/MM/yyyy или dd-MM-yyy или yyy-MM-dd без необходимости разбора.
Тем не менее, большое спасибо всем за ваши предложения (ParseExact и т.д.), которые действительно сработали. Они будут очень полезны для других форматов дат, которые я не смог обработать красивым способом (yyyyMMdd).
Marc
Сборки в .NET Framework не зависят от культуры.
В какой код вы пытаетесь преобразовать дату?
Если вы используете Parse
или TryParse
, попробуйте указать аргумент культуры, чтобы он понял Дата.