我写了一个简单的单元测试,在尝试解析日期" 20140404"时失败了。
DateTime dt;
DateTime.TryParse("20140404", out dt);
Assert.IsTrue(dt.Year == 2014 && dt.Month == 4 && dt.Day == 4);
如果我以预期的格式传递,有人可以为我清楚吗?
在我的网页表单上,我说我希望用户输入格式yyyymmdd。
答案 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.Parse
和DateTime.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()
将自己的格式添加到此集合中。