Извиняюсь, если об этом спрашивали раньше.У меня есть некоторые данные, которые мне нужно хранить в виде строк, некоторые из которых являются датами.Данные начинаются в виде строк, таких как "01/02/10" (формат Великобритании) .Теперь, позже, эти данные анализируются и, в зависимости от того, что делает анализ, результаты различаются (например, 01 февраля-10 против 02 января-10).Учитывая, что данные начинаются как строки, перед тем, как их сохранить, я бы хотел сказать, "если это похоже на дату, отформатируйте ее как dd-mmm-yy" .
.проблема в том, что многие вещи похожи на дату для функции DateTime.Parse ().
Итак, я применил некоторые правила и принимаю только «разумные» форматы дат для своих проверок и написал функцию IsDate ().Я ищу предложения о том, как это сделать, потому что, хотя оно работает, мое решение кажется очень неуклюжим.
Вся причина, по которой я это сделал, а не пошла дальше по обычной процедуре DateTime.TryParse, ясна, если у вас естькогда-нибудь начал бросать в него случайные строки (например, "3/4" и "6.12").
Вот что у меня есть:
class Program
{
static void Main(string[] args)
{
Debug.Assert(IsDate(6.12) == false);
Debug.Assert(IsDate("3/4") == false);
Debug.Assert(IsDate(010210) == false);
Debug.Assert(IsDate("010210") == false);
Debug.Assert(IsDate("12-jan-2000") == true);
Debug.Assert(IsDate("12-12-20") == true);
Debug.Assert(IsDate("1/1/34") == true);
Debug.Assert(IsDate("09/30/20") == false);
Debug.Assert(IsDate(DateTime.Now) == true);
}
static Boolean IsDate(Object value)
{
DateTimeFormatInfo DateTimeFormatGB = new CultureInfo("en-GB").DateTimeFormat; // new CultureInfo("en-US").DateTimeFormat;
return IsDate(value, DateTimeFormatGB);
}
static private List<String> AcceptableDateFormats = new List<String>(72);
static Boolean IsDate(Object value, DateTimeFormatInfo formatInfo)
{
if (AcceptableDateFormats.Count == 0)
{
foreach (var dateFormat in new[] { "d", "dd" })
{
foreach (var monthFormat in new[] { "M", "MM", "MMM" })
{
foreach (var yearFormat in new[] { "yy", "yyyy" })
{
foreach (var separator in new[] { "-", "/" }) // formatInfo.DateSeparator ?
{
String shortDateFormat;
shortDateFormat = dateFormat + separator + monthFormat + separator + yearFormat;
AcceptableDateFormats.Add(shortDateFormat);
AcceptableDateFormats.Add(shortDateFormat + " " + "HH:mm"); // formatInfo.TimeSeparator
AcceptableDateFormats.Add(shortDateFormat + " " + "HH:mm:ss");
}
}
}
}
}
String sValue = value.ToString().Trim();
DateTime unused;
foreach (String format in AcceptableDateFormats)
{
if (DateTime.TryParseExact(sValue, format, formatInfo, DateTimeStyles.None, out unused) == true) return true;
}
return false;
}
}
Я не использовал дату /разделители времени от информации о культуре, потому что я хотел принять и "/" и "-".Думаю, я мог бы использовать время один, потому что это вряд ли изменится (для меня).