Nodatime 使用 InstantPattern 解析 Instant 失败

Nodatime Parsing Instant with InstantPattern fails

我用的是NodaTime,版本=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 上午”
  2. “9/22/2017 12:02:53 下午”
  3. “2018 年 1 月 11 日 12:25:59 上午”

但不是第三个。为什么?

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

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

但问题是您将 HHtt 一起使用。 HH 表示“24 小时制”,因此值 12 表示中午 12 点......但是您的值指定它是 AM。

如果您查看异常消息,它会试图说明这一点:

Unhandled Exception: NodaTime.Text.UnparsableValueException: The individual values for the fields 'H' and 't' created an inconsistency in the NodaTime.LocalTime type. Value being parsed: '1/11/2018 12:25:59 AM'.

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

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

(请注意,您不需要转义 /: - 虽然它们对文化敏感,但您使用的是使用 / 值的不变文化和 : 无论如何,所以让它们不转义更简单。-InstantPattern 中没有特殊含义,所以也不需要转义。)

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