ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-11-21 18:07:26  阅读:191  来源: 互联网

标签:datetime-format datetime c net


我真的很惊讶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具有多个格式说明符.如;

> "M", "m"
> "O", "o"
> "R", "r"
> "Y", "y"

让我们看一下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 as;

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生成相同的格式,并将它们添加到作为此方法来源的结果数组中的原因.

除此之外,("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);
}

标签:datetime-format,datetime,c,net
来源: https://codeday.me/bug/20191121/2053683.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有