为什么DateTime tryparse在20140404日期失败

时间:2014-08-21 20:16:48

标签: c# datetime

我写了一个简单的单元测试,在尝试解析日期" 20140404"时失败了。

DateTime dt;
DateTime.TryParse("20140404", out dt);
Assert.IsTrue(dt.Year == 2014 && dt.Month == 4 && dt.Day == 4);

如果我以预期的格式传递,有人可以为我清楚吗?

在我的网页表单上,我说我希望用户输入格式yyyymmdd。

3 个答案:

答案 0 :(得分:3)

您需要在DateTime.TryParseExact

中提供格式
DateTime dt;
DateTime.TryParseExact("20140404",
                       "yyyyMMdd",
                       CultureInfo.InvariantCulture,
                       DateTimeStyles.None, 
                       out dt);

您还可以验证解析是否成功

DateTime dt;
if (DateTime.TryParseExact("20140404",
    "yyyyMMdd",
    CultureInfo.InvariantCulture,
    DateTimeStyles.None,
    out dt))
{
    //parsing successfull
}
else
{
    //parsing failed
}

TryParse方法组返回一个布尔值,指示解析是否成功。解析失败时,它返回false而不是引发异常,并为out变量分配默认值。这就是您的测试失败的原因,因为dt被分配了默认值dt = {01/01/0001 12:00:00 AM}

为什么使用TryParse进行解析会失败? ,因为DateTime.ParseDateTime.TryParse使用DateTimeFormatInfo Class中已定义的日期格式。你的格式不是其中之一。

答案 1 :(得分:1)

您需要指定自定义格式字符串并使用TryParseExact

bool success = DateTime.TryParseExact(
                            "20140404", 
                            "yyyyMMdd", 
                            CultureInfo.InvariantCulture, 
                            DateTimeStyles.None, 
                            out dt);

// Check success

如果您要忽略返回值,最好使用ParseExact代替TryParseExact,因为如果您输入错误数据,则会遇到异常。

答案 2 :(得分:1)

至于为什么它不起作用:DateTime.TryParse遍历DateTimeFormatInfo内的标准格式,而且不在列表中。

您可以通过执行

来验证这一点
new DateTimeFormatInfo().GetAllDateTimePatterns().ToList().ForEach(Console.WriteLine);

如果您不想使用ParseExact,可以使用SetAllDatePatterns()将自己的格式添加到此集合中。