Nodatime使用InstantPattern解析Instant失败

时间:2018-02-07 08:45:28

标签: c# .net nodatime

我使用NodaTime,版本= 2.2.3.0 我已经设置了一个匹配各种即时模式的模式 最后一个模式应该与下面的例子相匹配。

IPattern<Instant> pattern = new CompositePatternBuilder<Instant>
{
    { InstantPattern.CreateWithInvariantCulture("yyyy'-'MM'-'dd HH':'mm':'ss.FFFFFFF") , _ => true },
    { InstantPattern.CreateWithInvariantCulture("MM'/'dd'/'yyyy HH':'mm':'ss.FFFFFFF") , _ => false },
    { InstantPattern.CreateWithInvariantCulture("dd'-'MM'-'yyyy HH':'mm':'ss.FFFFFFF") , _ => false },
    { InstantPattern.CreateWithInvariantCulture("dd'/'MM'/'yyyy HH':'mm':'ss.FFFFFFF") , _ => false },
    { InstantPattern.CreateWithInvariantCulture("M'/'dd'/'yyyy HH':'mm':'ss.FFFFFFF") , _ => false },
    { InstantPattern.CreateWithInvariantCulture("MM'/'dd'/'yyyy HH':'mm':'ss.FFFFFFF") , _ => false },
    { InstantPattern.CreateWithInvariantCulture("M.d.yyyy HH':'mm':'ss.FFFFFFF") , _ => false },
    { InstantPattern.CreateWithInvariantCulture("dd.MM.yyyy HH':'mm':'ss.FFFFFFF") , _ => false },
    { InstantPattern.CreateWithInvariantCulture("M'/'d'/'yyyy H':'mm':'ss tt") , _ => false },
    { InstantPattern.CreateWithInvariantCulture("M'/'d'/'yyyy HH':'mm':'ss tt") , _ => false },
}
.Build();

我可以先解析两个

  1. “9/28/2017 10:55:49 AM”
  2. “9/22/2017 12:02:53 PM”
  3. “1/11/2018 12:25:59 AM”
  4. 但不是第三个。为什么?

    错误消息表示字符串第一个位置出现“^ 1/11/208 12:25:59 AM”错误。

1 个答案:

答案 0 :(得分:1)

首先,我认为你实际上并不需要那么多模式 - 例如,我怀疑你不需要<h1><span class="badge" id="loginbtn">main</span></h1> M版本。

但问题是您在MM使用HHtt表示&#34; 24小时制&#34;,因此值12表示12点...但是您的值指定它是AM。

如果查看异常消息,它会尝试清除:

  

未处理的异常:NodaTime.Text.UnparsableValueException:字段的各个值&#39; H&#39;并且&#39; t&#39;在NodaTime.LocalTime类型中创建了一个不一致。正在解析的价值:&#39; 1/11/2018 12:25:59 AM&#39;。

基本上,您应该使用HH代替:

h

(请注意,您不需要逃避var pattern = InstantPattern.CreateWithInvariantCulture("M/d/yyyy h:mm:ss tt"); / - 虽然他们对文化非常敏感,但您使用的是使用{{1}值的不变文化无论如何,只有将它们保留为未转义状态才更简单。:/中没有特殊含义,因此不需要转义。)

您的前两个值不会失败的原因是,在这些情况下,指定的24小时小时符合AM / PM指定。 &#34; 10&#34;是在上午,&#34; 12&#34;在下午。