Применение ISO 8601 Duration с использованием правильной номинальной интерпретации - PullRequest
0 голосов
/ 23 марта 2020

Кто-нибудь знает библиотеку C#, которая будет правильно применять строку продолжительности ISO 8601 к DateTime, используя «номинальные» значения для Y, M и т. Д. c.?

Используя System.Xml.XmlConvert::ToTimeSpan() неисправен. Он преобразует P1M в интервал времени в 30 дней, что означает, что он использует «точные» значения вместо «номинальных» значений, что бесполезно в большинстве моих сценариев использования:

См. 2.1. 7 номинальная продолжительность

Я не виню в этом ToTimeSpan (), так как TimeSpan не подходит для хранения номинальных значений. Мне нужно что-то, что я могу применить к DateTime и получить «номинально правильный» результат. Значение «2020-01-01» с примененным «P1Y» заканчивается как «2021-01-01».

1 Ответ

0 голосов
/ 23 марта 2020

На основе подсказки @Corak я интегрировал NodaTime в свой проект и добился того, что искал, с помощью чего-то похожего на следующее:

var sampleDuration = 'P3Y';
var parseResult = NodaTime.Text.PeriodPattern.NormalizingIso.Parse(sampleDuration);
if (parseResult.Success)
  {
    var expDateTime = NodaTime.LocalDateTime.FromDateTime(DateTime.UtcNow.Date).
                        Plus(parseResult.Value).ToDateTimeUnspecified();
  }

// If UTC time when run is 2020-01-01T00:00:00
// expDateTime should be 2023-01-01T00:00:00
...