1

我以这种格式从 .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 ......现在我有两个值,但是如何转换?

4

2 回答 2

1

正如我评论的那样,指定这样的时间很奇怪(将日期指定为日期/时间也很奇怪),但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,当然 :)

于 2013-02-12T08:47:45.543 回答
1

符号

<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);
于 2013-02-12T09:06:54.490 回答