我最近将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
我有点困惑,为什么我升级后会看到这个错误。有什么想法吗?
答案 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:ss
对TimeSpan
无效,它需要使用反斜杠转义冒号,如: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格式说明符也可以 不包括使您能够区分的符号 负时间和正时间间隔。要包含符号符号,您 必须使用条件逻辑构造格式字符串。该 其他字符部分包含一个示例。