将特定的ISO8601 TimeSpan(“P2M2W5D”)转换为C#TimeSpan

时间:2015-08-20 10:52:13

标签: c# parsing datetime xml-parsing iso8601

我一直在解析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

2 个答案:

答案 0 :(得分:7)

来自XmlConvert.ToTimeSpan method

  

参数

     

取值       键入:System.String

     

要转换的字符串。字符串格式必须符合 W3C XML架构第2部分:数据类型建议的持续时间。

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");

enter image description here

答案 1 :(得分:3)

由于指定了几个月,

TimeSpan无法处理此问题。 TimeSpan只是一些滴答声。由于一个月内的天数变化,因此无法转换为刻度。

另一个问题是'W'(周)是在ISO 8601中定义的,但在XML规范中没有定义,所以XmlConvert不知道它。