【问题标题】:TimeSpan.ParseExact giving errorTimeSpan.ParseExact 给出错误
【发布时间】:2012-08-20 11:39:37
【问题描述】:

我以这种方式创建了TimeSpan

TimeSpan ts = new Timespan();

// Do some addition and subtraction on it

然后我用这个将它保存到一个文件中

string.Format("{0}:{1}:{2}:{3}", ts.Hours, ts.Minutes, ts.Seconds, ts.MilliSeconds);

它返回的各种值是这样的

0:0:4:410
0:0:1:425
0:0:1:802
0:0:1:509
0:0:1:674
0:0:1:628
0:0:2:76

如何将其转换回 TimeSpan。

我正在使用

TimeSpan.ParseExact("0:0:4:410", "h:m:s:fff", null); 

但它给了我错误Input String is not in correct format.

我哪里错了?

【问题讨论】:

  • 顺便说一句,我很确定 0:0:2:76 无论如何都会产生 FormatException,因为它与 h:m:s:fff 不匹配(需要一个前导零!)
  • 通常我总是将ToStringParseExact 配对,并为两者使用相同的格式字符串。不是一个 hack-job,一端是格式字符串,另一端是基于格式字符串的解析。
  • 你正在努力改进你的答案over here,不是吗? :-)
  • @BigYellowCactus:是的,同时提高了我的 C# 知识。
  • @NikhilAgrawal 所以,我要 +1 来让自己变得更好

标签: c# timespan


【解决方案1】:

我相信您基本上需要解析冒号。我还建议使用不变的文化而不是当前的线程文化:

var ts = TimeSpan.ParseExact("0:0:4:410", @"h\:m\:s\:fff",
                             CultureInfo.InvariantCulture);

来自the documentation

自定义 TimeSpan 格式说明符不包含占位符分隔符,例如将天与小时、小时与分钟或秒与小数秒分开的符号。相反,这些符号必须作为字符串文字包含在自定义格式字符串中。例如,“dd.hh:mm”将句点 (.) 定义为天和小时之间的分隔符,将冒号 (:) 定义为小时和分钟之间的分隔符。

建议改用h:mm:ss.fff 的格式 - 我相信这会比您当前的格式更清晰。请注意,您可以直接使用格式而不是当前的格式化方法:

const string TimeSpanFormat = @"h\:mm\:ss\.fff";

string text = ts.ToString(TimeSpanFormat, CultureInfo.InvariantCulture);
...
TimeSpan parsed = TimeSpan.ParseExact(text, TimeSpanFormat,
                                      CultureInfo.InvariantCulture);

【讨论】:

  • "0:0:2:76" 怎么样?这个"@"h\:m\:s\:fff" 够用还是会出错?
  • @NikhilAgrawal:你现在可以自己回答这个问题,不是吗? (答案是否定的,它不会解析。你需要 076 或 760。)
  • @Rawling:确实,尽管使用 OP 当前的格式化方式,这会给出错误的答案(然后将 76 毫秒解析为 760)。基本上,当前的格式化方法是一个非常糟糕的主意。
  • 很公平,我只是注意到“不会抛出异常”而没有检查“给出正确答案”:)
【解决方案2】:

您将不得不转义 colons :当您进行解析时

TimeSpan.ParseExact("0:0:4:410", @"h\:m\:s\:fff", null)

自定义 TimeSpan 格式说明符不包含占位符 分隔符,例如将天与小时分开的符号, 小时从分钟,或秒从小数秒。相反,这些 符号必须作为字符串包含在自定义格式字符串中 文字。例如,“dd.hh:mm”将句点 (.) 定义为 天和小时之间的分隔符,冒号 (:) 作为分隔符 在小时和分钟之间。

was bitten some time back

【讨论】:

    【解决方案3】:

    试试这个:

    TimeSpan timeSpan = TimeSpan.ParseExact("0:0:4:410", @"h\:m\:s\:fff", null);
    

    【讨论】:

      猜你喜欢
      • 2014-06-07
      • 2017-12-20
      • 2012-09-25
      • 2013-03-21
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多