Ваша проблема здесь в том, что, поскольку компилятор видит только two digits/two digits/two digits
в обоих случаях, он не может знать, что вы хотите day/month/year
вместо month/day/year
, пока он не попытается фактически выполнить приведение, и заметит, что ваше значение для месяц >= 12
.
Вы можете решить эту проблему, разделив дату на /
и добавив аргументы в «правильном» порядке к компилятору, например так:
string[] dateParts = input.Split("/");
int day; int month; int year;
// You could use a boolean variable here to double-check that all casts are successful
Int32.TryParse(dateParts[0], out day);
Int32.TryParse(dateParts[1], out month);
Int32.TryParse(dateParts[2], out year);
var output = new DateTime(year, month, day);
Если вы поместите это в отдельную функцию, вы можете использовать ее для поддержки обоих форматов:
DateTime releaseDate;
try
{
// will throw exception if input is not in the default format
releaseDate = new DateTime(input);
}
catch (InvalidFormatException ex)
{
releaseDate = GetDateTimeFromNonStandardInput(input);
}
catch
{
throw; // or do whatever error handling you feel like.
}
Лично я бы написал GetDateTimeFromNonStandardInput()
как метод расширения для класса DateTime
.