50

System.FormatException当我尝试执行以下操作时(例如),我得到了一个:

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

我研究了ISO8601 标准,它似乎是正确的,但无论我做什么,我都无法让它在不抛出异常的情况下解析时间。

谢谢!

编辑:

异常详情:

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

3 回答 3

83

您需要将时间分隔符添加到您的字符串中。尝试这个:

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

请参阅持续时间规范 - http://www.w3.org/TR/xmlschema-2/#duration

3.2.6.1 词汇表示
持续时间的词汇表示是 [ISO 8601] 扩展格式 PnYn MnDTnH nMnS,其中 nY 表示年数,nM 表示月数,nD 表示天数,“T”是日期/时间分隔符,nH 小时数,nM 分钟数,nS 秒数。秒数可以包括任意精度的十进制数字。

根据评论编辑/更新

由于存在一些关于为什么字符串P2M2W5D不会被视为有效的问题,TimeSpan因为W它是 ISO 8601 标准的一部分,所以我想添加此更新,以便如果有人遇到该问题,他们不必通读评论得到答案。问题在于原始字符串P72HP2M2W5D字符串必须符合 W3C XML Schema(请参阅XmlConvert.ToTimeSpan的文档)。当我们查看 W3C XML Schema(上面的链接)时,它引用了 ISO 8601 标准,特别是第 5.5.3.2.1 节,它给出了W在 XML Schema 中不是有效字符的原因:

由于周没有明确的结转点(52 或 53),因此不应在这些应用程序中使用周

于 2012-09-17T19:59:01.437 回答
12

您一定错过了标准中的某些内容。以下:

System.Xml.XmlConvert.ToString(TimeSpan.FromHours(12))

给我字符串PT12H。所以似乎时间部分需要以T. 以下正确解析:

System.Xml.XmlConvert.ToTimeSpan("PT25H")

(到一个TimeSpan字符串化为1.01:00:00。)

于 2012-09-17T19:59:23.440 回答
4

请使用以下格式System.Xml.XmlConvert.ToTimeSpan("PnYnMnDTnHnMnS")

P - 指示符必须放在日期格式之前。

nY - 年数,例如:2Y
nM - 月数 例如:4M
nD - 天数 例如:6D

T - 必须放在时间格式之前的指示符

nH - 小时数 例如:8H
nM - 分钟数例如:12M
nS - 秒数 例如:14S

    System.Xml.XmlConvert.ToTimeSpan("P2Y4M6DT8H12M14S")

在这里,与 Month 和 Minutes 混淆的部分用相同的字母表示,但指示符的使用使它们分开以便于理解。

于 2018-04-17T05:26:59.943 回答