使用IT-it文化忽略DateTime.ParseExact中的零

时间:2013-11-20 16:56:13

标签: 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都是不可接受的解决方案。我该怎么办?


  

lang.Culture的价值是什么?

当出现问题时,我正在使用意大利语浏览器进行测试,我猜,这是“IT-it”。

2 个答案:

答案 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