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挽救了这一天。谢谢特里帕斯拯救了这一天。谢谢