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

标签 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

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

最佳答案

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

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

关于c# - 为什么 GetAllDateTimePatterns 方法不返回唯一格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23889299/

相关文章:

java - Spring中的日期时间格式

javascript - 在远程数据源调用之前将过滤器注入(inject)数据源

.net - 访问 VB.NET 中 protected 成员

C# Linq 聚合中间值

c# - 具有非基于文件的 key 的 SFTP

c# - Visual Studio 2013,JavaScriptExecutor 使用指令

php - 如何使用 PHP 将年份添加到纪元时间

ios - 日期时间格式化程序崩溃

c# - 在哪里可以找到设计良好的小型 C# 应用程序的源代码(用于学习目的)?

c# - 使用 Open XML SDK 在 C# 中创建的演示文稿在打开时已损坏且为空白