将时间值的字符串表示形式解析为TimeSpan
本文关键字:TimeSpan 表示 时间 字符串 | 更新日期: 2023-09-27 18:14:27
我有一个包含多个属性的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的正确方法是什么,所以我可以把这些值加起来?
这取决于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
值(f.e。在List<TimeSpan>
中,您可以使用Enumerable.Sum
:
TimeSpan sumDuration = new TimeSpan(allDurations.Sum(t => t.Ticks));
用同样的方法试试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
变量将存储正确的值
,你不能用TimeSpan.Parse
方法解析这个值。
[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
如果你只有几秒钟的时间,使用TimeSpan。FromSeconds
编辑:for string in op:
string s = "0.455"
var span = TimeSpan.FromSeconds(Convert.ToDouble(s))
您可以将值解析为double并使用TimeSpan。FromSeconds方法。