从.Net 2.0升级到.Net 4.5.2后的String.Format异常

时间:2014-12-02 16:31:19

标签: c# asp.net .net

我最近将ASP.Net表单应用程序升级到.Net 4.5.2,在修复了一些相对微不足道的命名空间问题后,我能够成功构建解决方案。但是在运行时我收到了以下错误:

  

类型' System.FormatException'的例外情况发生在mscorlib.dll中但未在用户代码中处理

当以下行抛出调试时:

string.Format("Init took {0:mm:ss}", (object) DateTime.Now.Subtract(renderStartTime))  

其中renderStartTime = DateTime.Now

我有点困惑,为什么我升级后会看到这个错误。有什么想法吗?

3 个答案:

答案 0 :(得分:6)

这是一个重大改变。

请参阅:Formatting and Parsing Time Intervals in the .NET Framework 4

  

.NET Framework 3.5及更早版本中,TimeSpan没有   实现IFormattable也不支持格式字符串。   因此,“r”格式字符串被忽略,并且无参数   调用 TimeSpan.ToString 方法。在.NET Framework 4中,关于   另一方面, TimeSpan.ToString(String,IFormatProvider)被调用并且   传递了不受支持的格式字符串,这会导致异常。

为了扩展答案,您在.Net framework 2.0中的原始代码不会抛出异常,但它不会提供所需的输出,(分钟:秒)。由于参数less构造函数将调用TimeSpan,因此忽略String.Format中指定的格式。 但是,与.Net framework 4.0或hgiher,由于TimeSpan实现了IFormattable,指定格式mm:ss将传递给ToString调用。现在,此格式mm:ssTimeSpan无效,它需要使用反斜杠转义冒号,如:mm\:ss。这就是你得到例外的原因。

请参阅:Custom TimeSpan Format Strings

在.Net 3.5或更低版本中,您可以使用:

TimeSpan elapsed = DateTime.Now - renderStartTime; //or DateTime.Now.Subtract(renderStartTime)
string formatted = string.Format("Init took {0}:{1}", elapsed.Minutes, elapsed.Seconds); //returns minutes and seconds components, 
                                        // If you are looking for Total Minutes and Total Seconds then use TotalMinutes/TotalSeconds

在.Net framework 4.0或更高版本中,您可以这样做:

string.Format("Init took {0:mm\\:ss}", elapsed);

答案 1 :(得分:3)

问题是第二次冒号。您可以执行以下操作

string.Format("Init took {0:mm}:{0:ss}", DateTime.Now.Subtract(renderStartTime));

修改

根据TimeSpan在.Net 3.5及更早版本中的工作原理,.Net 2.0中的原始代码实际上会以hh:mm:ss格式打印出时间。基本上是" mm:ss"部分格式被忽略,因为TimeSpan未实现IFormattable。因此.Net 4.5.2中的以下内容非常接近于替换原始代码在.Net 2.0中所做的工作。

string.Format("Init took {0}", DateTime.Now.Subtract(renderStartTime));

但是,如果您只想显示分钟和秒数,则可以使用.Net 4.0及更高版本中的{0:mm}:{0:ss}{0:mm\\:ss}格式。或者在.Net 3.5或更早版本中你必须这样做。

TimeSpan diff = DateTime.Now.Subtract(renderStartTime);
string.Format("Init took {0:00}:{1:00}", diff.Minutes, diff.Seconds);

答案 2 :(得分:3)

 Console.WriteLine(string.Format("Init took {0:mm\\:ss}", DateTime.Now.Subtract(renderStartTime)));

在这里,您需要看起来像这样的代码。如果您想要

,您可以这样做
 Console.WriteLine(string.Format(@"Init took {0:mm\:ss}", DateTime.Now.Subtract(renderStartTime)));

您可以阅读此微软documentation以获取更多帮助:

  

自定义TimeSpan格式说明符不包含占位符   分隔符号,例如将小时与小时分开的符号,   几分钟或几秒钟的小时数。相反,这些   符号必须作为字符串包含在自定义格式字符串中   文字。例如,“dd.hh:mm”将句点(。)定义为   天和小时之间的分隔符,以及冒号(:)作为分隔符   小时和分钟之间。自定义TimeSpan格式说明符也可以   不包括使您能够区分的符号   负时间和正时间间隔。要包含符号符号,您   必须使用条件逻辑构造格式字符串。该   其他字符部分包含一个示例。