2014-09-24 137 views
4

我尝试下面的代码:DateTime.ParseExact返回当前日期

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

我的问题是这个解析是如何工作的?

回答

6

作为每MSDN

如果格式定义没有时间元件和解析操作 成功的日期,所得到的日期时间值具有午夜 (00:00:00)的时间。如果格式定义了没有日期元素的时间并且解析操作成功,则生成的DateTime值的日期为 DateTime.Now.Date。

您的格式字符串与值相同 - 因此解析按原样进行,不会抛出异常。 如果您要更改格式字符串说,02/02/2013 - 您将得到FormatException如预期

5

格式字符串中没有日/月占位符。因此,它实际上匹配每个字符(成功),并为日期的每个组件返回默认(今天)值。

事实上,如果没有它会抛出错误,如

DateTime.ParseExact("11/02/2013", 
        "01/02/2013", // string format 
        CultureInfo.InvariantCulture); 

行为非常相似,一些合理的(“11/...”和“01/...”之间不匹配的通知)没有精确匹配像“MM/yyyy”这样的模式 - 期待月,比完全匹配/字符,比年。

默认值是午夜当前日期DateTime.ParseExact的:

如果格式定义一个时间没有日期元件和解析操作成功,则得到的日期时间值具有DateTime.Now.Date的日期。

+1

是不是默认日期值是:'{01/01/0001 12:00:00 AM}'您有任何参考它在哪里选择当前日期作为默认值? – user2711965 2014-09-24 15:45:42

+2

@ user2711965同样,在文档中:'如果格式定义了一个没有日期元素的时间并且解析操作成功,则生成的DateTime值的日期为DateTime.Now.Date.' – tnw 2014-09-24 15:46:40

1

MSDN

public static DateTime ParseExact(string s, string format, IFormatProvider provider) 

如果格式定义一个时间没有日期元件和解析操作成功,则得到的日期时间值具有DateTime.Now.Date的日期。

相关问题