【问题标题】:Converting a specific ISO8601 TimeSpan ("P2M2W5D") to a C# TimeSpan [duplicate]将特定的 ISO8601 TimeSpan(“P2M2W5D”)转换为 C# TimeSpan [重复]
【发布时间】:2015-11-13 23:32:03
【问题描述】:

我已经解析 ISO8601 TimeSpan 值有一段时间了,直到我遇到一个导致我的代码抛出 System.FormatException 的值:

TimeSpan ts = XmlConvert.ToTimeSpan("P2M2W5D");

查看ISO8601 Standard,这似乎是一个正确的输入,而且没有任何歧义(M 显然是指月份,而不是分钟)。

System.FormatException was unhandled by user code
HResult=-2146233033
Message=The string 'P2M2W5D' is not a valid TimeSpan value.
Source=System.Xml

【问题讨论】:

    标签: c# parsing datetime xml-parsing iso8601


    【解决方案1】:

    来自XmlConvert.ToTimeSpan method

    参数

    类型:System.String

    要转换的字符串。字符串格式必须符合 W3C XML Schema Part 2: Datatypes 建议的持续时间。

    还有Duration section

    持续时间的词汇表示是 [ISO 8601] 扩展 格式PnYn MnDTnH nMnS,其中nY代表年数,nM 月数,nD 天数,'T' 是日期/时间 分隔符,nH 小时数,nM 分钟数和 nS 秒数。

    来自ISO 8601 Date and Time Formats

    在持续时间的词汇格式中,以下字符也是 用作指示符并以词汇格式显示为自身:

    • P -- 用作持续时间指示符,位于表示给定持续时间的数据元素之前。
    • Y -- 跟随着时间段中的年数。
    • M -- 跟随着时间段中的月数或分钟数。
    • D -- 跟随时间段中的天数。
    • H -- 跟随时间段中的小时数。
    • S -- 跟随持续时间中的秒数。

    据我所知,XML 规范中没有W 作为持续时间格式。

    例如,这是有效的;

    TimeSpan ts = XmlConvert.ToTimeSpan("P2M5D");
    

    【讨论】:

      【解决方案2】:

      TimeSpan 无法处理此问题,因为已指定月份。 TimeSpan 只是一些滴答声。由于一个月的天数不同,因此无法转换为刻度。

      另一个问题是 ISO 8601 中定义了“W”(周),但 XML 规范中没有定义,因此 XmlConvert 不知道。

      【讨论】:

        猜你喜欢
        • 2012-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多