簡體   English   中英

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

[英]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',
};

這就是為什么這個方法和重載將為mM生成相同的格式,並且它們添加到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM