Вот метод, который работает:
/// <summary>
/// Checks date validity.
/// </summary>
/// <param name="candidate">String to check</param>
/// <returns>Whether valid and result as a date</returns>
private static Tuple<bool, DateTime?> ParseDate(string candidate)
{
DateTime result;
if(DateTime.TryParseExact(candidate, "dd.MM.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd.M.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd.MM.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "d.M.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd/M/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "d/M/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd.MM.yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd.M.yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd.MM.yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "d.M.yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd/MM/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd/M/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd/MM/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "d/M/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result)
)
{
return new Tuple<bool, DateTime?>(true, result);
}
return new Tuple<bool, DateTime?>(false, null);
}
Мне кажется довольно бесполезным добавлять туда тонны or-веток. Что было бы более разумным способом сделать это? Я думал, что DateTime.TryParse сделает это, но ему удалось каким-то образом выйти из строя с 15.6.2020 (в прошлый понедельник) и вернуть, что это недействительная дата.
И да, у меня есть миллион или-веток я знаю. Это тоже большая проблема, с которой я хотел бы помочь.