【问题标题】:Why GetAllDateTimePatterns method doesn't return unique formats?为什么 GetAllDateTimePatterns 方法不返回唯一格式?
【发布时间】:2014-05-27 12:20:44
【问题描述】:

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 标准模式。

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

为什么这个方法会多次返回相同的模式?

【问题讨论】:

    标签: c# .net datetime datetime-format


    【解决方案1】:

    主要原因是;因为一些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 as;

    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);
    }
    

    【讨论】:

    • 3周后,由于这个问题没有得到更好的答案,我接受了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2015-01-02
    • 2019-06-29
    相关资源
    最近更新 更多