Подтвердить что ты не робот

Что не так с DateTime.Parse(myString)?

Я просматривал Скотта Гензельмана Список вопросов о интервью для разработчиков, и столкнулся с этим вопросом:

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Как MSDN Помещает:

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

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