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

Cod*_*man 37 c# xml datetime parsing xml-parsing

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

TimeSpan ts = XmlConvert.ToTimeSpan("P72H");
Run Code Online (Sandbox Code Playgroud)

我已经调查了ISO8601标准,它似乎是正确的,但无论我做什么,我都无法解析它而不会抛出异常.

谢谢!

编辑:

例外细节:

System.FormatException was unhandled by user code
HResult=-2146233033
Message=The string 'P72H' is not a valid TimeSpan value.
Source=System.Xml
Run Code Online (Sandbox Code Playgroud)

pst*_*jds 64

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

TimeSpan ts = XmlConvert.ToTimeSpan("PT72H");
Run Code Online (Sandbox Code Playgroud)

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

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

  • @ Pheonixblade9 - 那是因为`D`是天,你需要在指示时间时添加时间分隔符`T`. (5认同)
  • 来自ISO8601维基百科网址:"为了解决歧义,"P1M"是一个月的持续时间,"PT1M"是一分钟的持续时间(注意时间指示符,T,它在时间值之前).P4D没有歧义,它不包含任何时间组件,但对于具有时间组件的值,"T"是必需的. (5认同)
  • 因为'W'不是ISO8601架构的一部分.`P2M5D`和`P2M19D`是有效的,我假设你的字符串中你想要的是'2W`. (2认同)
  • @AlexandruMărculescu - 对不起,当我回复你的评论并忘记给你贴上标签时,我已经筋疲力尽了.您的问题是`W`不是ISO8601架构的一部分.如果你的意思是"周",只需将"2W"转换为"14D"就可以正常工作了. (2认同)

mil*_*ose 10

你一定错过了标准中的东西.下列:

System.Xml.XmlConvert.ToString(TimeSpan.FromHours(12))
Run Code Online (Sandbox Code Playgroud)

给了我一个字符串PT12H.所以似乎时间部分需要以a为前缀T.以下解析正确:

System.Xml.XmlConvert.ToTimeSpan("PT25H")
Run Code Online (Sandbox Code Playgroud)

(以TimeSpan字母串联到1.01:00:00.)


Rav*_*r B 7

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

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

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

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

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

    System.Xml.XmlConvert.ToTimeSpan("P2Y4M6DT8H12M14S")
Run Code Online (Sandbox Code Playgroud)

这里,与“月”和“分钟”混淆的部分具有相同的字母来表示,但指示符的用法使它们分开以便于理解。