我使用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/11/208 12:25:59 AM”错误。
首先,我认为你实际上并不需要那么多模式 - 例如,我怀疑你不需要M
和MM
版本。
但问题是你正在使用HH
和tt
。 HH
的意思是“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。