我尝试了以下代码:
DateTime dateTime = DateTime.ParseExact("01/02/2013", //string date
"01/02/2013", // string format
CultureInfo.InvariantCulture);
我知道格式不正确。但为什么不是抛出异常而是返回当前日期dateTime = {24/09/2014 12:00:00 AM}
。
我知道我的约会的有效格式应为MM/dd/yyyy
,但为什么它没有抛出异常。我还尝试使用DateTime.TryParseExact
,它返回当前日期而不是default(DateTime)
。这实际上是在阅读this question。
我的问题是这个解析是如何工作的?
答案 0 :(得分:6)
根据MSDN:
如果format定义了没有time元素的日期和解析操作 成功后,生成的DateTime值的时间为午夜 (00:00:00)。如果format定义了一个没有日期元素的时间和 解析操作成功,生成的DateTime值的日期为 DateTime.Now.Date。
您的格式字符串与值相同 - 因此解析按“原样”进行,并且不会抛出任何异常。
如果您要将格式字符串更改为02/02/2013
- 您将按预期获得FormatException
答案 1 :(得分:5)
格式字符串中没有日/月占位符。因此它按字面匹配每个字符(成功)并返回日期的每个组成部分的默认(今天)值。
确实如果没有完全匹配,它会抛出错误(注意" 11 /..."" 01 /..."}之间不匹配。
DateTime.ParseExact("11/02/2013",
"01/02/2013", // string format
CultureInfo.InvariantCulture);
行为与一些合理的模式非常相似,例如" MM / yyyy" - 预期月份,与/
字符完全匹配,而不是年份。
默认值当前日期的午夜 DateTime.ParseExact:
如果format定义了没有日期元素的时间并且解析操作成功,则生成的DateTime值的日期为DateTime.Now.Date。
答案 2 :(得分:1)
来自MSDN:
public static DateTime ParseExact(string s, string format, IFormatProvider provider)
如果format定义了没有日期元素的时间并且解析操作成功,则生成的DateTime值的日期为DateTime.Now.Date。