.NET:为什么TryParseExact在Hmm和Hmmss上失败?

Svi*_*ish 11 .net c# datetime parsing datetime-format

我正在尝试这种DateTime.TryParseExact方法,而且我遇到了一个我不明白的案例.我有一些格式和一些主题要解析每个格式应完全匹配其中一种格式:

var formats = new[]
     {
         "%H",
         "HH",
         "Hmm",
         "HHmm",
         "Hmmss",
         "HHmmss",
     };

var subjects = new[]
     {
         "1",
         "12",
         "123",
         "1234",
         "12345",
         "123456",
     };
Run Code Online (Sandbox Code Playgroud)

然后我尝试解析它们并打印出结果:

foreach(var subject in subjects)
{
    DateTime result;
    DateTime.TryParseExact(subject, formats, 
        CultureInfo.InvariantCulture, 
        DateTimeStyles.NoCurrentDateDefault,
        out result);

    Console.WriteLine("{0,-6} : {1}", 
        subject,
        result.ToString("T", CultureInfo.InvariantCulture));
}
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

1      : 01:00:00
12     : 12:00:00
123    : 00:00:00
1234   : 12:34:00
12345  : 00:00:00
123456 : 12:34:56
Run Code Online (Sandbox Code Playgroud)

而我的问题是......为什么它在123和12345失败了?不应该成为01:23:00和01:23:45吗?我在这里错过了什么?我怎么能像我期望的那样让它工作?


更新:所以,似乎我们可能已经弄清楚为什么这是失败的.似乎H实际上抓住两个数字,然后只留下一个数字,mm然后失败.但是,有没有人对如何更改此代码有一个好主意,以便我得到我想要的结果?

另一个更新:想想我现在找到了一个合理的解决方案.添加它作为答案.将在2天内接受它,除非其他人想出更好的一个.谢谢您的帮助!

Svi*_*ish 13

好的,所以我想我现在已经想到这一切了,感谢更多的阅读,实验和其他有用的答案.发生的事情是,H,ms实际上可以抓取两位数,即使其余格式没有足够的数字.因此,例如格式为Hmm和数字123,H将抓住12并且仅剩下3.并且mm需要两位数,所以它失败了.Tadaa.

所以,我的解决方案目前只使用以下三种格式:

var formats = new[]
    {
        "%H",
        "Hm",
        "Hms",
    };
Run Code Online (Sandbox Code Playgroud)

由于我的问题的其余代码保持不变,我将得到这样的结果:

1      : 01:00:00
12     : 12:00:00
123    : 12:03:00
1234   : 12:34:00
12345  : 12:34:05
123456 : 12:34:56
Run Code Online (Sandbox Code Playgroud)

我认为应该是合理的和可接受的:)