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();
我可以解析前两个
- “9/28/2017 10:55:49 上午”
- “9/22/2017 12:02:53 下午”
- “2018 年 1 月 11 日 12:25:59 上午”
但不是第三个。为什么?
错误消息表示字符串的第一个位置出现“^1/11/2018 12:25:59 AM”错误。
首先,我认为您实际上不需要那么多模式 - 例如,我怀疑您不需要 M
和 MM
版本。
但问题是您将 HH
与 tt
一起使用。 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”是下午。
我用的是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();
我可以解析前两个
- “9/28/2017 10:55:49 上午”
- “9/22/2017 12:02:53 下午”
- “2018 年 1 月 11 日 12:25:59 上午”
但不是第三个。为什么?
错误消息表示字符串的第一个位置出现“^1/11/2018 12:25:59 AM”错误。
首先,我认为您实际上不需要那么多模式 - 例如,我怀疑您不需要 M
和 MM
版本。
但问题是您将 HH
与 tt
一起使用。 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”是下午。