Ошибка синтаксического анализа Nodatime Instant с помощью InstantPattern

Я использую 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 AM"
  2. "9/22/2017 12:02:53 PM"
  3. "1/11/2018 12:25:59 AM"

Но не 3-й. Почему ?

сообщение об ошибке указывает на ошибку «^ 1/11/2018 00:25:59» в первой позиции строки.


person Christian Johansen    schedule 07.02.2018    source источник


Ответы (1)


Во-первых, я не думаю, что вам действительно нужно так много шаблонов - я подозреваю, что вам не нужны, например, версии M и MM.

Но проблема в том, что вы используете HH с tt. HH означает «24-часовые часы», поэтому значение 12 означает 12 часов дня... но тогда ваше значение указывает, что сейчас AM.

Если вы посмотрите на сообщение об исключении, оно попытается прояснить это:

Необработанное исключение: NodaTime.Text.UnparsableValueException: отдельные значения для полей «H» и «t» создали несогласованность в типе NodaTime.LocalTime. Анализируемое значение: «11.01.2018, 00:25:59».

По сути, вместо этого вы должны использовать h:

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

(Обратите внимание, что вам не нужно экранировать / и : — хотя они чувствительны к культуре, вы используете инвариантную культуру, которая в любом случае использует значения / и :, поэтому проще просто оставить их без экранирования. - не имеет особых значение в InstantPattern, так что это тоже не нужно экранировать.)

Причина, по которой ваши первые два значения не ошибаются, заключается в том, что в этих случаях указанный 24-часовой час дня соответствует обозначению AM/PM. «10» — это AM, а «12» — это PM.

person Jon Skeet    schedule 08.02.2018
comment
Да это оно. Большое спасибо. Я собираюсь очистить записи базы данных и убедиться, что все они читаются и пишутся в формате iso. Тогда я избавлюсь от всех шаблонов. - person Christian Johansen; 08.02.2018