【问题标题】:Applying ISO 8601 Duration using correct nominal interpretation使用正确的名义解释应用 ISO 8601 持续时间
【发布时间】:2020-03-23 14:51:06
【问题描述】:

有谁知道使用 Y、M 等的“名义”值将 ISO 8601 持续时间字符串正确应用到 DateTime 的 C# 库?

使用System.Xml.XmlConvert::ToTimeSpan() 是错误的。它将 P1M 转换为 30 天的时间跨度,这意味着它使用“准确”值而不是“名义”值,这在我的大多数用例中都没有帮助:

See 2.1.7 nominal duration

不过,我不怪 ToTimeSpan(),因为 TimeSpan 不足以存储名义值。我需要一些可以应用于 DateTime 并获得“名义上正确”的结果的东西。应用“P1Y”的意思是“2020-01-01”最终为“2021-01-01”。

【问题讨论】:

  • @jpt 请你把你的问题说得更清楚一点。特别是,请您给出您期望的输入和您期望的输出的清晰示例。大多数人对 ISO-8601 的复杂性不够精通,无法了解 nominalaccurate 的含义,而链接定义 duration expressed amongst others in years, months, weeks or days 需要进一步阅读才能真正理解。
  • 您在寻找Noda Time(特别是“期间”)吗?完全披露,我不与 Noda Time 合作,所以我不知道它是否以你想要的方式反序列化,但如果 that lib 没有,我不会知道哪个会。
  • @RB - 这就是我提供文档链接的原因,而 DID 提供了我期望的输入和输出示例。无论如何,问题空间需要思考才能真正理解,因此任何不愿意这样做的人可能都不是回答我问题的最佳人选。
  • @gunr2171 - 不,这不是我问题的答案。这不太相关。 ISO 8601 为持续时间和日期/时间指定格式。我对使用 C# 将 Duration 应用于 DateTime 很感兴趣。

标签: c# date datetime iso8601


【解决方案1】:

根据@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

【讨论】:

    猜你喜欢
    • 2014-07-16
    • 2014-08-16
    • 2021-02-16
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2021-05-21
    相关资源
    最近更新 更多