我对 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
标准模式。
调试时甚至可以看到这些重复的模式;
为什么这个方法多次返回相同的模式?
最佳答案
主要原因是;因为一些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();
}
此方法调用 GetAllDateTimePatterns(char)
method使用 DateTimeFormat.allStandardFormats
数组的所有返回值。而这个数组 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);
}
关于c# - 为什么 GetAllDateTimePatterns 方法不返回唯一格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23889299/