我一直在解析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
答案 0 :(得分:7)
来自XmlConvert.ToTimeSpan
method
参数
取值 键入:System.String
要转换的字符串。字符串格式必须符合 W3C XML架构第2部分:数据类型建议的持续时间。
持续时间的词汇表示是[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");
答案 1 :(得分:3)
TimeSpan
无法处理此问题。 TimeSpan
只是一些滴答声。由于一个月内的天数变化,因此无法转换为刻度。
另一个问题是'W'(周)是在ISO 8601中定义的,但在XML规范中没有定义,所以XmlConvert不知道它。