Я хотел бы пойти с чем-то вроде:
[Flags]
public enum DateFormatStringKind
{
HasNone = 0,
HasDate = 1 << 0,
HasTime = 1 << 1,
HasBoth = HasDate | HasTime
}
public static DateFormatStringKind DescribeFormatString(string s, IFormatProvider provider)
{
DateTime d = new DateTime(2, 2, 2, 1, 1, 1, 1); // DateTime will all non-default values
DateTime d2 = DateTime.ParseExact(d.ToString(s, provider), s, provider, System.Globalization.DateTimeStyles.NoCurrentDateDefault);
DateFormatStringKind result = DateFormatStringKind.HasNone;
if (d2.Date.Ticks != 0)
result |= DateFormatStringKind.HasDate;
if (d2.TimeOfDay != TimeSpan.Zero)
result |= DateFormatStringKind.HasTime;
return result;
}
var culture = System.Globalization.CultureInfo.InvariantCulture;
Console.WriteLine(DescribeFormatString("dd/MM/yyyy", culture));
Console.WriteLine(DescribeFormatString("yyyy MM yyyy", culture));
Console.WriteLine(DescribeFormatString("h:mmtt", culture));
Console.WriteLine(DescribeFormatString("dd h:mmtt", culture));
Console.WriteLine(DescribeFormatString("'literal'", culture));
HasDate
HasDate
HasTime
HasBoth
HasNone
Он преобразует дату со всеми полями не по умолчанию в строку, используя строку формата, а затем обратно, используяв той же строке формата, а затем проверяет, какие поля пережили преобразование.
Если в шаблоне не было компонента даты, часть «дата» будет иметь значение 0001-01-01
, что является нулевой датой (нулевые отметки източка 0).Флаг NoCurrentDateDefault
гарантирует, что текущая дата не используется вместо этого.
Если в шаблоне не было компонента времени, время будет сброшено до полуночи (TimeSpan.Zero
с полуночи).
Если в шаблоне даты был хотя бы один компонент (год, месяц или день), соответствующее поле станет 2
, что больше значения по умолчанию 1
для полей даты, поэтому оно будет обнаружено независимокакого компонента это было.
Если в шаблоне времени был хотя бы один компонент (часы, минуты, секунды, миллисекунды), он станет 1
, что больше значения по умолчанию 0
дляполя времени, поэтому он снова будет обнаружен независимо от того, каким компонентом он был.