Nodatime使用InstantPattern解析Instant失败

问题描述 投票:0回答:1

我使用JodaTime,Version = 2.2.3.0我已经设置了一个匹配各种Instant模式的模式。最后一个模式应该与下面的例子相匹配。

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”

但不是第三个。为什么?

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

c# .net nodatime
1个回答
1
投票

首先,我认为你实际上并不需要那么多模式 - 例如,我怀疑你不需要MMM版本。

但问题是你正在使用HHttHH的意思是“24小时制”,所以12的值意味着12点......但是你的值指的是它是AM。

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

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

基本上,你应该使用h代替:

var pattern = InstantPattern.CreateWithInvariantCulture("M/d/yyyy h:mm:ss tt");

(请注意,你不需要逃避/: - 虽然它们是文化敏感的,你使用的是使用/:值的不变文化,所以只是让它们没有转义就更简单了.-没有什么特别之处。在InstantPattern中的含义,因此也不需要转义。)

您的前两个值未失败的原因是,在这些情况下,指定的24小时小时与AM / PM指定匹配。 “10”在AM,“12”在PM。

© www.soinside.com 2019 - 2024. All rights reserved.