Как сравнивать даты независимо от текущей культуры в .NET - PullRequest
1 голос
/ 15 октября 2010

Я жестко закодировал дату окончания пробной версии в своем приложении .net 2.5.как сравнить ее с системной датой пользователя, чтобы сравнение было точным независимо от настроек культуры пользователя?

DateTime maxTrialDate = DateTime.Parse ("17.11.2020", новая System.Globalization.CultureInfo("en-US"));

DateTime curDate = DateTime.Parse (DateTime.Now.ToShortDateString (), new System.Globalization.CultureInfo ("en-US"));

// следующая строка кода использует метод DateDiff для сравнения двух дат - не вызывайте его // точный синтаксис.

На моем компьютере с XP вышеуказанное работает, если региональная настройка панели управления для datetime включена.США, но если я изменю его на en-AU, то приведенный выше код, который устанавливает curDate, запускает исключение FormatException «Дата не в правильном формате строки»

Ответы [ 6 ]

4 голосов
/ 15 октября 2010

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

DateTime maxTrialDate = new DateTime(2020, 11, 17);

if (DateTime.Now.Date > maxTrialDate)
{
     // expired
}

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

0 голосов
/ 15 октября 2010

Почему вы используете метод Parse, если вы жестко запрограммировали дату окончания срока действия, просто сравните ее с DateTime.now

0 голосов
/ 15 октября 2010

Если я правильно помню, в большинстве мест за пределами США стандартный формат даты - дд / мм / гггг, а не стандарт США в мм / дд / гггг. Может случиться так, что, пытаясь проанализировать дату, он полагает, что 17 - это месяц, который является недопустимым месяцем, что приводит к ошибке.

0 голосов
/ 15 октября 2010

Ожидается FormatException, поскольку вы явно просите парсер использовать en-US.

Попробуйте вызвать перегрузка с одним аргументом из DateTime.Parse(), или, в качестве альтернативы, если вы действительно хотите использовать перегрузку с двумя аргументами (* cough * FxCop * cough *), что-то вроде:

using System.Globalization;

DateTime.Parse("11/17/2020", CultureInfo.CurrentCulture);
0 голосов
/ 15 октября 2010

Вы можете использовать System.Globalization.CultureInfo.InvariantCulture

0 голосов
/ 15 октября 2010

Как насчет использования CultureInfo.InvariantCulture повсюду?

...