【问题标题】:Parse string representation of time values to TimeSpan将时间值的字符串表示解析为 TimeSpan
【发布时间】:2014-07-23 22:18:41
【问题描述】:

我有一个包含多个属性的 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 的正确方法是什么,以便我可以总结这些值?

【问题讨论】:

  • 你的CurrentCulture是什么?
  • 什么是 0.345 ?分钟?秒?
  • 你需要指定时间属性的单位是什么? 0.345s、0.345h 还是什么??
  • @faby 是小数/毫秒秒。 0 秒 345 毫秒

标签: c# parsing format timespan


【解决方案1】:

这取决于 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&lt;TimeSpan&gt; 中),您就可以使用 Enumerable.Sum

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

【讨论】:

    【解决方案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 变量将存储正确的值

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        编辑:操作中的字符串:

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

        【讨论】:

        • TimeSpan.FromSeconds 需要double。我有一个string 值。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2010-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-21
          • 1970-01-01
          相关资源
          最近更新 更多