此代码片段生成一个异常:
string t = @"11\10\2023";
string _fmt = @"MM\dd\yyyy";
DateTime l = DateTime.ParseExact(t, _fmt, CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
例外是:
System.FormatException
HResult=0x80131537
Message=String '' 未被识别为有效的日期时间。
Source = System.Private.CoreLib
StackTrace:
在System.DateTime.ParseExact(字符串s,字符串格式,IFormatProvider提供者)
这是为什么?
您的格式字符串使用反斜杠。在自定义格式字符串中,反斜杠用于转义下一个字符,因此您的格式字符串需要诸如"11d10y123"(将解析为有效)的输入。
如果您希望按字面意思处理反斜杠,则需要通过添加双反斜杠来转义它:
string _fmt = @"MM\\dd\\yyyy";
Run Code Online (Sandbox Code Playgroud)
请注意,这不是C# 语言级别的转义。该字符串确实包含双反斜杠,因为这就是您想要传递给DateTime.ParseExact.
(我注意到,像这样使用反斜杠作为分隔符是不寻常的。如果您可以控制格式,我建议使用正斜杠,或者 - 当我有选择时我的强烈偏好 - 遵循 ISO-8601这样的格式yyyy-MM-dd不仅避免了各种斜杠,而且还消除了“月在先与日在先”的歧义。当然,您可能无法控制正在解析的值。)