我正在使用以下代码解析此日期:"3/1/1961"
:
DateTime d = DateTime.ParseExact(theStringDate, "d", lang.Culture);
我想每个人都会同意我"3/1/1961"
和"03/01/1961"
的日期相同。但是,在第一种情况下,代码将崩溃,而在第二种情况下,代码将不会崩溃。
为什么C#表现得这样?有没有办法"3/1/1961"
不能正确解释?如何告诉编译器在数字之前忽略0
的缺席?
强制我的用户在每个数字之前写0
或使用JS强制存在0
都是不可接受的解决方案。我该怎么办?
lang.Culture的价值是什么?
当出现问题时,我正在使用意大利语浏览器进行测试,我猜,这是“IT-it”。
答案 0 :(得分:4)
我不确定您是如何使用当前格式d
进行解析的,它应该是"d/M/yyyy"
string theStringDate = "03/01/1961";
DateTime d = DateTime.ParseExact(theStringDate, "d/M/yyyy", CultureInfo.InvariantCulture);
格式"d/M/yyyy"
适用于单日数字和双位数日/月。
答案 1 :(得分:2)
您正在使用parse exact,输入字符串不是您指定的格式。 C#表现得并不奇怪,你只是误用了这个方法。这个片段直接来自msdn,并准确地解释了为什么会出现异常;
// Parse date-only value without leading zero in month using "d" format.
// Should throw a FormatException because standard short date pattern of
// invariant culture requires two-digit month.
dateString = "6/15/2008";
try {
result = DateTime.ParseExact(dateString, format, provider);
Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException) {
Console.WriteLine("{0} is not in the correct format.", dateString);
}
您可以使用多种解决方案。这里有几个我的头顶;更改您的格式说明符(我认为将"d"
替换为"g"
将解决您的问题,在这种情况下,您仍会获得其他格式的例外),将DateTime.ParseExact
更改为{{1} }或DateTime.Parse
,或更改您的输入,使其符合您所需的完全格式。
我个人建议摆脱DateTime.TryParse
。你知道你的约会的确切格式是什么吗?好像你没有。如果不这样做,为什么要使用ParseExact
?