C# 忽略DateTime.ParseExact中的零及其区域性
我正在用以下代码解析此日期:C# 忽略DateTime.ParseExact中的零及其区域性,c#,datetime,C#,Datetime,我正在用以下代码解析此日期:“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都是不
“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
都是不可接受的解决方案。我能做什么
语言文化的价值是什么
当问题出现时,我正在从一个意大利浏览器进行测试,因此,我猜,它是“it it”。我不确定您是如何使用当前格式
d
进行解析的,它应该是“d/M/yyyy”
格式
“d/M/yyyy”
适用于一位数和两位数的日/月 我不确定您是如何使用当前格式解析的d
,它应该是“d/M/yyyy”
格式
“d/M/yyyy”
适用于一位数和两位数的日/月 您使用的是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
更改为DateTime.Parse
或DateTime.TryParse
,或者更改您的输入,使其符合您所需的确切格式
就个人而言,我建议摆脱
ParseExact
。你知道你的约会将采用什么格式吗?看来你没有。如果没有,为什么要使用ParseExact
?您使用的是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
更改为DateTime.Parse
或DateTime.TryParse
,或者更改您的输入,使其符合您所需的确切格式
就个人而言,我建议摆脱
ParseExact
。你知道你的约会将采用什么格式吗?看来你没有。如果没有,为什么要使用ParseExact
?我猜OP不想使用不变区域性,因为它在调用中有lang.culture
。有没有不依赖于固定区域性的解决方案?我建议将格式字符串中的/
替换为lang.culture.DateTimeFormat.DateSeparator
,我们可以使用lang.culture
如果用户连接到ENG-culture怎么办?“d/M/yyyy”不再有效。我猜OP不想使用不变区域性,因为它在调用中有lang.culture
。有没有不依赖于固定区域性的解决方案?我建议将格式字符串中的/
替换为lang.culture.DateTimeFormat.DateSeparator
,我们可以使用lang.culture
如果用户连接到ENG-culture怎么办?“d/M/yyyy”不再有效。lang.Culture的值是多少?取决于用户。当问题出现时,我正在一个意大利浏览器上进行测试。线索在单词exact中。要扩展Tony的评论:ParseExact
,输入必须精确匹配new DateTime(1961,1,3)。ToString(“d”,lang.Culture)
。lang.Culture
的值是多少?这取决于用户。当问题出现时,我正在一个意大利浏览器上进行测试。线索在单词exact中。为了扩展Tony的评论:ParseExact
,输入必须与new DateTime(1961,1,3)精确匹配。ToString(“d”,lang.Culture)
。TryParse挽救了这一天。谢谢特里帕斯拯救了这一天。谢谢