我以这种格式从 .NET Web 服务获取时间/持续时间:PT12H30M
如何处理?
下面是我从 web 服务获取的 Xml
<a:Date>2013-01-09T00:00:00</a:Date>
<a:StartTime>PT11H30M</a:StartTime>
<a:EndTime>PT12H</a:EndTime>
我只想将其转换为标准 C# DateTime 格式。有人可以帮我吗?
注意:我已经解析了 xml ......现在我有两个值,但是如何转换?
我以这种格式从 .NET Web 服务获取时间/持续时间:PT12H30M
如何处理?
下面是我从 web 服务获取的 Xml
<a:Date>2013-01-09T00:00:00</a:Date>
<a:StartTime>PT11H30M</a:StartTime>
<a:EndTime>PT12H</a:EndTime>
我只想将其转换为标准 C# DateTime 格式。有人可以帮我吗?
注意:我已经解析了 xml ......现在我有两个值,但是如何转换?
正如我评论的那样,指定这样的时间很奇怪(将日期指定为日期/时间也很奇怪),但Noda Time处理这样的时间段:
LocalDateTimePattern dateTimePattern = LocalDateTimePattern.ExtendedIsoPattern;
LocalDateTime date = dateTimePattern.Parse(dateText).Value;
PeriodPattern pattern = PeriodPattern.RoundtripPattern;
Period startTime = pattern.Parse(startTimeText).Value;
Period endTime = pattern.Parse(endTimeText).Value;
LocalDateTime startDateTime = date + startTime;
LocalDateTime endDateTime = date + endTime;
如果您真的愿意,您可以在之后将其转换为 BCLDateTime
值,但我鼓励您在整个应用程序中使用 Noda Time,当然 :)
符号
<a:StartTime>PT11H30M</a:StartTime>
<a:EndTime>PT12H</a:EndTime>
对应于 datatypes.xsd 中指定的 dayTimeDuration(基于持续时间数据类型) - 请查看此处以获取说明。
P = duration marker
nD = optional unsigned integer corresponding to number of days
T = date time separator
nH = number of hours
等等 - 你明白了:)
因此,要解析它,您可以执行以下快速而肮脏的示例:
var xmla = @"
<root xmlns:a=""a"">
<a:Date>2013-01-09T00:00:00</a:Date>
<a:StartTime>PT11H30M</a:StartTime>
<a:EndTime>PT12H</a:EndTime>
</root>";
var ns = new XmlNamespaceManager(new NameTable());
ns.AddNamespace("a", "a");
var ele = XElement.Parse(xmla);
var start = ele.XPathSelectElement("//a:StartTime", ns);
var end = ele.XPathSelectElement("//a:EndTime", ns);
var startTime = XmlConvert.ToTimeSpan(start.Value);
var endTime = XmlConvert.ToTimeSpan(end.Value);
var date = ele.XPathSelectElement("//a:Date", ns);
var dateTime = XmlConvert.ToDateTime(date.Value, XmlDateTimeSerializationMode.RoundtripKind);
Console.WriteLine("Ran at {0} for a duration of {1}", dateTime + startTime, endTime - startTime);