2014-07-23 27 views
1

我有一個包含多個屬性的XML文件,其中包含時間值,我需要將這些值相加。將時間值的字符串表示解析爲TimeSpan

<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的這些時間值,所以我可以總結這些值?

+0

什麼是您的'CurrentCulture'? –

+1

什麼是0.345?分鐘?秒? – faby

+0

你需要指定那個時間屬性的單位是什麼? 0.345s,0.345h還是什麼? – cjb110

回答

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值( FE在List<TimeSpan>),可以使用Enumerable.Sum

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

如果你只有秒,使用TimeSpan.FromSeconds

編輯:字符串在OP:

string s = "0.455" 
var span = TimeSpan.FromSeconds(Convert.ToDouble(s)) 
+0

'TimeSpan.FromSeconds'需要一個'double'。我有一個'string'值。 – Jehof

2

嘗試以這種方式與TimeSpan.FromSeconds

var [email protected]"<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

,你不能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