Что не так с DateTime.Parse (myString)? - PullRequest
23 голосов
/ 02 октября 2008

Я просматривал список вопросов Интервью с Скоттом Хансельманом и наткнулся на этот вопрос:

Что не так с DateTime.Parse (туЗЬптд)

Хотя я знаю, что при анализе строки неизвестного формата или происхождения существуют неотъемлемые риски, есть ли другие причины? Вместо этого использовать DateTime.ParseExact? Должен ли это быть myString.ToString () первым?

Ответы [ 8 ]

27 голосов
/ 02 октября 2008

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

14 голосов
/ 02 октября 2008

Использование текущей культуры потоков в системе часто является плохой идеей, как «попробуйте различные форматы и посмотрите, работает ли какой-либо из них».

ParseExact с определенной культурой - намного более контролируемый и точный подход. (Даже если вы укажете текущую культуру, читателям станет более очевидно, что именно так и происходит.)

6 голосов
/ 02 октября 2008

Как указано в MSDN:

Поскольку метод Parse (String) пытается разобрать строковое представление дата и время с использованием форматирования правила современной культуры, пытаясь проанализировать определенную строку через разные культуры могут либо потерпеть неудачу, либо вернуть разные результаты. Если конкретный формат даты и времени будет разобрали по разным локалям, используем DateTime.Parse (String, IFormatProvider) или один из перегрузки метода ParseExact и укажите спецификатор формата.

3 голосов
/ 02 октября 2008

Этот вопрос только для того, чтобы узнать, знает ли разработчик проблемы с этим. Сначала вы должны использовать TryParse, потому что Parse выдает исключение, если оно не разбирается. Кроме того, он не учитывает языковой стандарт, поэтому в веб-сценарии, если британский пользователь вводит 02/10/2008, а мой сервер использует языковой стандарт для США, я получаю 10 февраля 2008 года вместо 2 октября 2008 года.

Могут быть и другие проблемы, но это первые две, которые возникли на уме.

1 голос
/ 02 октября 2008

Моя внутренняя реакция будет такова, что вы попали в нее с неизвестными форматами / происхождением. Могут быть и другие причины - например, из этой единственной строки мы знаем , что myString является строкой? (Я предполагаю, что это, конечно.)

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

Конечно, исходя из вашей формулировки ... Я предполагаю, что вы уже все это знали. :)

1 голос
/ 02 октября 2008

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

0 голосов
/ 01 ноября 2011

Ответ зависит от кода, который окружает DateTime.Parse (myString) и требований синтаксического анализа

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

Без контекста вопрос довольно двусмысленный, и реальный ответ на него должен быть «это зависит от контекста, в котором используется код, относительно того, что с ним не так, если

0 голосов
/ 02 октября 2008

это сообщение в блоге объясняет это , но в основном это то, что с синтаксическим анализом не связано никакой Cultureinfo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...