我很惊讶DateTimeFormatInfo.GetAllDateTimePatterns
method没有返回独特的标准格式。
让我举一个InvariantCulture
;
var pattern = CultureInfo.InvariantCulture.DateTimeFormat
GetAllDateTimePatterns();
foreach (var format in pattern)
{
Console.WriteLine(format);
}
在.NET Framework 4.5中,此代码将打印34
标准模式。
当我使用Enumerable.Distinct
method这个方法时;
var pattern = CultureInfo.InvariantCulture.DateTimeFormat.
GetAllDateTimePatterns().
Distinct();
foreach (var format in pattern)
{
Console.WriteLine(format);
}
此代码将在相同条件下打印29
标准模式。
调试时甚至可以看到这些重复的模式;
为什么此方法多次返回相同的模式?
答案 0 :(得分:3)
主要原因是;因为standard date and time format strings中的一些有多个格式说明符。如;
让我们看一下GetAllDateTimePatterns
方法implemented;
public String[] GetAllDateTimePatterns()
{
List<String> results = new List<String>(DEFAULT_ALL_DATETIMES_SIZE);
for (int i = 0; i < DateTimeFormat.allStandardFormats.Length; i++)
{
String[] strings = GetAllDateTimePatterns(DateTimeFormat.allStandardFormats[i]);
for (int j = 0; j < strings.Length; j++)
{
results.Add(strings[j]);
}
}
return results.ToArray();
}
此方法使用DateTimeFormat.allStandardFormats
数组的所有返回值调用GetAllDateTimePatterns(char)
method。这个数组implemented为;
internal static char[] allStandardFormats =
{
'd', 'D', 'f', 'F', 'g', 'G',
'm', 'M', 'o', 'O', 'r', 'R',
's', 't', 'T', 'u', 'U', 'y', 'Y',
};
这就是为什么这种方法和重载会为m
和M
生成相同格式的原因,并且它们会添加到results
数组中,这是此方法的来源。
除此之外,("F") Format Specifier
和("U") format specifier
是等效的。这些也会生成相同的格式,这些格式在GetAllDateTimePatterns(char)
method's impelementation;
public String[] GetAllDateTimePatterns(char format)
{
String [] result = null;
switch (format)
{
case 'd':
result = this.AllShortDatePatterns;
break;
case 'D':
result = this.AllLongDatePatterns;
break;
case 'f':
result = GetCombinedPatterns(AllLongDatePatterns, AllShortTimePatterns, " ");
break;
case 'F':
case 'U':
result = GetCombinedPatterns(AllLongDatePatterns, AllLongTimePatterns, " ");
break;
case 'g':
result = GetCombinedPatterns(AllShortDatePatterns, AllShortTimePatterns, " ");
break;
case 'G':
result = GetCombinedPatterns(AllShortDatePatterns, AllLongTimePatterns, " ");
break;
case 'm':
case 'M':
result = new String[] {MonthDayPattern};
break;
case 'o':
case 'O':
result = new String[] {DateTimeFormat.RoundtripFormat};
break;
case 'r':
case 'R':
result = new String[] {rfc1123Pattern};
break;
case 's':
result = new String[] {sortableDateTimePattern};
break;
case 't':
result = this.AllShortTimePatterns;
break;
case 'T':
result = this.AllLongTimePatterns;
break;
case 'u':
result = new String[] {UniversalSortableDateTimePattern};
break;
case 'y':
case 'Y':
result = this.AllYearMonthPatterns;
break;
default:
throw new ArgumentException(Environment.GetResourceString("Format_BadFormatSpecifier"), "format");
}
return (result);
}