Вопрос

Мы только что перешли на новый сервер, и все идет хорошо.Однако ранее я столкнулся с ошибкой .NET при попытке преобразовать строку в формате "дд / мм / гггг" в дату, теперь я изменил настройки языка в локальном web.config, но мы требуем, чтобы это было глобальным.

Где мне это изменить?Я предположил, что это machine.config, но я не смог найти никаких знакомых настроек на более старом сервере.

Или я должен посмотреть на стороне сервера и найти параметр для установки культуры на компьютере, чтобы быть en-GB?

== ОБНОВЛЕНИЕ == Я изменил региональные настройки, и, к сожалению, это по-прежнему не удается.Существует ли глобальная настройка machine.config, которая может привести к сбоям?На данный момент кажется, что он использует invariant и терпит неудачу с этим.

Я использую Windows Server 2008 с IIS7, если это вообще поможет.

Используемая строка жестко закодирована на странице, поскольку это дата закрытия регистрационной формы для одноразового сайта.

Выполняемый код выглядит следующим образом:

if (DateTime.Now > Convert.ToDateTime("26/04/2008 12:00"))

Очень простой и работавший миллион раз до сих пор, эта ошибка возникает только при этой новой настройке.

Это было полезно?

Решение 2

В конце концов (и я не уверен, был ли это лучший способ сделать это или нет) Мне пришлось выбрать компьютер в IIS7 и установить там настройки глобализации на en-GB.Это решило проблему, а также позволит сохранить все мои другие веб-сайты в будущем в этой среде, если не указано иное.

Обратите внимание, что я уже изменил региональные настройки компьютеров на UK, и это не решило проблему.

Однако с этого момента я буду следовать предложению Альфреда указать культуру для анализа даты как.

Другие советы

При переносе серверов я бы рекомендовал вам использовать те же региональные настройки (Панель управления), что и раньше - если это возможно.Просто делая это, вы избегаете множества проблем.

Однако это может оказаться невозможным, если на новом сервере будут размещены другие приложения, для которых требуются другие региональные настройки, или если вам придется изменить это из-за новых политик.

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

Для этого даже существует правило FxCop (и статического анализа).


Обновлено, чтобы отразить новую информацию по вопросу:

Конвертировать.Текущее время - это "удобный" метод, реализованный как:


public static DateTime ToDateTime(string value)
{
    if (value == null)
    {
        return new DateTime(0L);
    }
    return DateTime.Parse(value, CultureInfo.CurrentCulture);
}

Обратите внимание, что он вызывает DateTime .Синтаксический анализ, передающий явный CultureInfo (CultureInfo.CurrentCulture).

CultureInfo.CurrentCulture получает это значение из потока.currentThread.CurrentCulture.

Вы можете взглянуть на CultureInfo.CurrentCulture, чтобы увидеть, что на самом деле возвращает CultureInfo, и / или продолжить расследование, чтобы попытаться понять, что происходит, но, с другой стороны, рекомендуется, чтобы вы явно указать форматер, который будет использоваться при разборе строк на другие типы данных, такие как DateTime, Double и т.д.

Как я уже говорил в моем первоначальном ответе, существует правило FxCop (статический анализ) для проверки отсутствия IFormatProvider, переданного методам, которые перегружают получение его экземпляра: СА1305.

Поэтому я бы порекомендовал вам переписать код примерно так:


if (DateTime.Now > DateTime.Parse("26/04/2008 12:00", new CultureInfo("en-GB")))

Вы должны указывать, какой язык вы хотите использовать всякий раз, когда вы преобразуете строку в дату.

Язык, который вы должны использовать, зависит от того, в каком языке отформатированы даты.Например, если все анализируемые даты отформатированы как Словацкий:

String s = "24. 10. 2011";

Затем вам нужно разобрать строку так, как если бы она была в Словацкий (Slovakia) (sk-SK) культура:

//Bad:
d = DateTime.Parse(s);

//Good:
d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("sk-SK")); //Slovak (Slovakia)

Если все ваши свидания проходят в Таджикский (таджикская кириллица), затем вам нужно разобрать его как tg-Cryl-Tj:

String s = "24.10.11"

DateTime d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("tg-Cryl-Tj"));

Что приводит к вопросу:какой формат даты вы используете?Вы не должны полагаться на настройки локали сервера, вы должны решить, какой формат вы хотите.

//Bad
String s = d.ToString();

//Good
String s = d.ToString(CultureInfo.CreateSpecificCulture("si-LK")); //Sinhala (Sri Lanka)

//s = "2011-10-24 12:00:00 පෙ.ව."

я подозреваю, что вы предпочитаете все делать на английском.Но тогда вы должны решить, какой вариант английского:

  • en-IA (Англоязычная Индия): 24-10-2011 15:19:52
  • en-BZ (Английский Белиз): 24/10/2011 03:19:52 PM
  • en-AU (Английская Австрия): 24/10/2011 3:19:52 PM
  • en-NZ (Английский язык Новой Зеландии): 24/10/2011 3:19:52 p.m.
  • en-GB (Английский Соединенное Королевство): 24/10/2011 15:19:52
  • en-ZA (Английская Южная Африка): 2011/10/24 03:19:52 PM
  • en-US (Английский Соединенные Штаты): 10/24/2011 3:19:52 PM

Но если вы действительно не можете решить, какой язык использовать при преобразовании дат в строки и наоборот, и даты никогда не предназначены для показа пользователю, тогда вы можете использовать Инвариантная Культура:

String s = "10/24/2011" //invariant culture formatted date

d = DateTime.Parse(s, CultureInfo.InvariantCulture); //parse invariant culture date

s = d.ToString(CultureInfo.InvariantCulture); //convert to invariant culture string
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top