为何DateTime.ParseExact解析指定字面量字符串时抛出异常?
DateTime.ParseExact抛出FormatException的原因
问题代码
string t = @"11\10\2023"; string _fmt = @"MM\dd\yyyy"; DateTime l = DateTime.ParseExact(t, _fmt, CultureInfo.InvariantCulture);
异常信息
System.FormatException
HResult=0x80131537
Message=String '' was not recognized as a valid DateTime.
Source=System.Private.CoreLib
StackTrace:
at System.DateTime.ParseExact(String s, String format, IFormatProvider provider)
原因分析
核心问题出在格式字符串的反斜杠解析规则:
- 输入字符串
t是逐字字符串(带@前缀),实际内容是11\10\2023,其中的\是字面量分隔符。 - 但
DateTime.ParseExact的格式字符串中,\是转义字符,作用是把后续字符标记为日期格式说明符(比如d代表日、M代表月),而非字面量符号。 - 你写的
@"MM\dd\yyyy"会被解析成:MM+ 转义后的d+d+ 转义后的y+yyy,完全不匹配输入字符串的11\10\2023结构,最终导致解析失败抛出异常。
解决方法
要在格式字符串中表示字面量反斜杠,有两种正确写法:
- 逐字字符串里用双反斜杠表示单个字面量反斜杠:
string _fmt = @"MM\\dd\\yyyy"; - 用单引号包裹字面量反斜杠(逐字字符串中单引号需写两个):
string _fmt = @"MM'\''dd'\''yyyy";
内容的提问来源于stack exchange,提问作者Michael EstrinOne
相关产品推荐
相关产品推荐

