C# TimeSpan.ParseExact给定错误

C# TimeSpan.ParseExact给定错误,c#,timespan,C#,Timespan,我用这种方式创建了一个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

我用这种方式创建了一个
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); 
但它给了我一个错误
输入字符串的格式不正确。


我哪里错了?

基本上,我认为您需要解析冒号。我还建议使用不变区域性而不是当前线程区域性:

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

自定义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);

在进行解析时,必须转义
冒号

TimeSpan.ParseExact("0:0:4:410", @"h\:m\:s\:fff", null)
自定义TimeSpan格式说明符不包括占位符 分隔符符号,例如将天与小时分隔的符号, 从分钟算小时,或从分数秒算秒。相反,这些 符号必须作为字符串包含在自定义格式字符串中 文字。例如,“dd.hh:mm”将句点(.)定义为 天和小时之间的分隔符,并使用冒号(:)作为分隔符 几小时到几分钟之间

试试这个:

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

顺便说一句,我很确定
0:0:2:76
无论如何都会产生一个FormatException,因为它不匹配
h:m:s:fff
(其中需要一个前导零!)通常我总是将
ToString
ParseExact
配对,并使用相同的格式字符串。这不是一个一端是格式化字符串,另一端是基于格式化字符串的解析的黑客工作。您正在尝试改进您的答案,不是吗?:-)@BigYellowCactus:是的,同时提高了我的C#知识。@NikhilAgrawal,所以,因为我试图变得更好,+1关于
“0:0:2:76”
?这个
“@”h \:m \:s \:fff”
足够了还是会出错?@NikhilAgrawal:你现在可以自己回答这个问题了,是吗?(答案是不,不会解析。你需要076或760。)@Rawling:的确,尽管按照OP目前的格式,这会给出错误的答案(76毫秒将被解析为760毫秒)。基本上,当前的格式化方法是一个彻头彻尾的坏主意。公平地说,我只是注意到在没有选中“给出正确答案”的情况下“不会引发异常”: