![](/img/trans.png)
[英]Why does DateTimeFormatInfo.GetAllDateTimePatterns return different results in different .NET versions?
[英]Why GetAllDateTimePatterns method doesn't return unique formats?
我真的很驚訝DateTimeFormatInfo.GetAllDateTimePatterns
方法不返回唯一的標准格式。
讓我舉一個InvariantCulture
的例子;
var pattern = CultureInfo.InvariantCulture.DateTimeFormat
GetAllDateTimePatterns();
foreach (var format in pattern)
{
Console.WriteLine(format);
}
在.NET Framework 4.5中,此代碼將打印34
標准模式。
當我用這個方法使用Enumerable.Distinct
方法時;
var pattern = CultureInfo.InvariantCulture.DateTimeFormat.
GetAllDateTimePatterns().
Distinct();
foreach (var format in pattern)
{
Console.WriteLine(format);
}
此代碼將在相同條件下打印29
標准模式。
調試時甚至可以看到這些重復的模式;
為什么此方法多次返回相同的模式?
主要原因是; 因為某些標准日期和時間格式字符串具有多個格式說明符。 如;
我們來看看如何實現 GetAllDateTimePatterns
方法;
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)
方法 。 並且這個數組實現為;
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
和("U") format specifier
是等價的。 這些也生成相同的格式,這些格式在GetAllDateTimePatterns(char)
方法的處理中處理;
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.