将时间值的字符串表示解析为TimeSpan

时间:2014-07-23 12:25:27

标签: c# parsing format timespan

我有一个包含多个属性的XML文件,其中包含时间值,我需要将这些值相加。

<test>
   <value time="0.345"/>
   <value time="0.756"/>
   <value time="0.455"/>
</test>

但问题是TimeSpan.Parse("0.345")不解析值并导致异常。使用TimeSpan.Parse("0.345",System.Globalization.CultureInfo.GetCultureInfo("en-us"))的事件会导致异常。

Message
Die Zeichenfolge wurde nicht als gültiger TimeSpan erkannt. 

StackTrace
   bei System.Globalization.TimeSpanParse.TimeSpanResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument, String failureArgumentName)
   bei System.Globalization.TimeSpanParse.ProcessTerminal_HM(TimeSpanRawInfo& raw, TimeSpanStandardStyles style, TimeSpanResult& result)
   bei System.Globalization.TimeSpanParse.ProcessTerminalState(TimeSpanRawInfo& raw, TimeSpanStandardStyles style, TimeSpanResult& result)
   bei System.Globalization.TimeSpanParse.TryParseTimeSpan(String input, TimeSpanStandardStyles style, IFormatProvider formatProvider, TimeSpanResult& result)
   bei System.TimeSpan.Parse(String s)

那么将这些时间值解析为TimeSpan的正确方法是什么,所以我可以将这些值加起来?

5 个答案:

答案 0 :(得分:2)

这取决于1对你来说意味着什么,一小时,分钟,秒,日,年....

假设它意味着小时:

decimal hourFraction = decimal.Parse("0.345", CultureInfo.InvariantCulture);
long ticks = (long)(hourFraction * TimeSpan.FromHours(1).Ticks);
TimeSpan duration = new TimeSpan(ticks); // approximately 20 minutes

获得所有TimeSpan值后(List<TimeSpan>中的f.e。),您可以使用Enumerable.Sum

TimeSpan sumDuration = new TimeSpan(allDurations.Sum(t => t.Ticks));

答案 1 :(得分:2)

使用TimeSpan.FromSeconds

尝试这种方式
   var x=@"<root>
            <value time=""0.345""/>
            <value time=""0.756""/>
            <value time=""0.455""/>
        </root>";

   TextReader tr = new StringReader(x);
   var doc = XDocument.Load(tr);
   var timeSpanResult = TimeSpan.FromSeconds(doc.Descendants("value").Sum(
                y =>
                {
                    double value;
                    if (double.TryParse(y.Attribute("time").Value, NumberStyles.Any, CultureInfo.InvariantCulture, out value))
                    {
                        return value;
                    }
                    return 0;
                }));

我假设值都是小数秒。 最后,您的timeSpanResult变量将存储正确的值

答案 2 :(得分:2)

,您无法使用TimeSpan.Parse方法解析此值。

来自documentation;

[ws][-]{ d | [d.]hh:mm[:ss[.ff]] }[ws]
  

方括号([])中的元素是可选的。一个选择   大括号({})中括起来的替代品列表,以...分隔   需要竖线(|)。

如您所见,您不需要小时和分钟部分。这就是你获得FormatException的原因。

一个解决方案可以是将字符串值与"0:0:"连接起来,以获得可以成功解析的"0:0:0.345"字符串。

TimeSpan.Parse("0:0:0.345", new CultureInfo("de-DE")); // 00:00:00.3450000

答案 3 :(得分:1)

如果您只有秒,请使用TimeSpan.FromSeconds

编辑:对于op:

中的字符串
 string s = "0.455"
 var span = TimeSpan.FromSeconds(Convert.ToDouble(s))

答案 4 :(得分:0)

您可以将值解析为double并使用TimeSpan.FromSeconds方法。