如何将ISO8601 TimeSpan转换为C#TimeSpan?

时间:2012-09-17 19:51:54

标签: c# xml parsing datetime xml-parsing

当我尝试执行以下操作时,我得到System.FormatException(作为示例):

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

我已经调查了ISO8601 Standard并且它似乎是正确的,但无论我做什么,我无法在不抛出异常的情况下解析它。

谢谢!

编辑:

例外细节:

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

3 个答案:

答案 0 :(得分:58)

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

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秒数。秒数可以包括任意精度的十进制数字。

答案 1 :(得分:9)

你一定错过了标准中的内容。以下内容:

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

给我字符串PT12H。因此,时间部分似乎需要以T作为前缀。以下解析正确:

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

(要TimeSpan字符串化为1.01:00:00。)

答案 2 :(得分:2)

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

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

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

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

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

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

这里,带有月份和分钟的混淆部分具有相同的字母来表示,但指定者的使用使它们分开以便于理解。