为什么GetAllDateTimePatterns方法不返回唯一格式?

时间:2014-05-27 12:20:45

标签: c# .net datetime datetime-format

我很惊讶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标准模式。

调试时甚至可以看到这些重复的模式;

enter image description here

为什么此方法多次返回相同的模式?

1 个答案:

答案 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',
};

这就是为什么这种方法和重载会为mM生成相同格式的原因,并且它们会添加到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);
}