Недостаточно использовать DateTime.ParseExact или DateTime.TryParseExact. /
- специальный символ форматирования, символ разделителя даты. В строке формата он будет заменен любым разделителем даты для текущей культуры приложения. Этого нельзя избежать, потому что это не специальный символ, как \
. Это вызовет проблемы, если в вашей системе используется .
(Россия и другие страны).
Чтобы указать другой разделитель даты, вам нужно создать объект CultureInfo с нужным разделителем. Следующая функция принимает список разделителей и пытается выполнить разбор даты, используя каждый разделитель, пока один из них преуспевает:
public static bool TryParseDate(string input, string[] separators, out DateTime date)
{
var ci = (CultureInfo) CultureInfo.InvariantCulture.Clone();
foreach (var separator in separators)
{
ci.DateTimeFormat.DateSeparator = separator;
DateTime result;
if (DateTime.TryParseExact(input, "dd/MM/yyyy", ci, DateTimeStyles.None,
out date))
return true;
}
date=new DateTime();
return false;
}
Там нет необходимости определять несколько форматов, потому что dd/MM/yyyy
матчей всех случаев.
Это позволяет писать код, как в следующем фрагменте:
var separators = new []{"/",".",",","-"};
DateTime result;
var success1 = TryParseDate("12.05.2015", separators, out result);
var success2 = TryParseDate("12/05/2015", separators, out result);
var success3 = TryParseDate("12,05,2015", separators, out result);
var success4 = TryParseDate("12-05-2015", separators, out result);
я добавил -
, потому что я вижу, что это общий сепаратор в Германии. Вы можете сделать функцию еще более общей, передав формат в качестве другого параметра.
TryParseExact
принимает несколько параметров формата. Если бы это было не для /
сепаратора, вы могли бы написать один вызов со всеми форматами:
var formats=new []{"dd.MM.yyyy","dd,MM,yyyy","dd-MM-yyyy"};
DateTime result;
var success=DateTime.TryParseExact(input, formats,
CultureInfo.InvariantCulture, DateTimeStyles.None,
out date)
Вы знаете, что культуры соответствуют этим значениям? Если вы это сделаете, вы можете передать их любой функции синтаксического анализа –
На самом деле это не основано на культурном контексте, я должен анализировать реальный пользовательский ввод, и разные люди склонны вводить дату по-разному, даже если они прочитали руководство и знают формат программное обеспечение ожидает. Я просто не хочу бросать исключение и заставлять их вводить дату снова, а просто анализировать ее независимо от этих различий. – astralmaster
Возможно, вы захотите добавить '-'. Я вижу из Википедии, что он используется как разделитель в Германии, Франция –