DateTime.ParseExact失败取决于解析的字符串的长度

时间:2010-04-14 13:33:48

标签: c# datetime

这很奇怪。我有以下代码:

Assert.AreEqual(new DateTime(2000, 1, 1), DateTime.ParseExact("2000", "yyyy", CultureInfo.InvariantCulture));
Assert.AreEqual(new DateTime(2000, 1, 1), DateTime.ParseExact("20000705", "yyyy", CultureInfo.InvariantCulture));

第一行通过,第二行以“System.FormatException: String was not recognized as a valid DateTime”失败。

我无法缩短要解析的字符串以匹配格式的长度 - 它可以在这种特殊情况下工作,但这是更通用的方法的一部分,并且它会在其他地方失败。对于第二次通话失败的原因有任何想法吗?

[编辑]好的,我希望它能够根据需要解析输入字符串以满足格式。

我在很多格式中获得了很多字符串,并且我有一种接受这两种方法的方法,经过一些处理后(我只得到日期,所以我将“m”替换为“M”和“Y”用“y”等等,我打电话给DateTime.ParseExact。我不能调用DateTime.Parse的原因是因为它不允许格式参数...我可以在程序的一部分得到ddMMyyyy而在另一部分得到yyyyddMM,没有办法让它正确地解决它。

[编辑2]我想这是我的错......当问题出现时我将不得不截断输入。幸运的是,我通常在格式中包含日期的所有部分,这(仅一年)是罕见的。谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

失败是绝对正确的 - 你已经告诉它要完全预期4个字符,然后给它8个!

选项:

  • 为通话提供更多格式字符串(例如“yyyyMMdd”)(您可以指定多种有效格式)
  • 只传入您希望与格式匹配的字符串
  • 自己解析字符串

你声称截断字符串“会在其他地方失败” - 你能提供更多细节吗?如果你指定“yyyy”,那么大概你知道你需要4个字符......你知道它们在字符串中的确切位置吗?如果是这样,为什么不能执行截断?

答案 1 :(得分:1)

失败是因为DateTime.ParseExact要求输入字符串与指定的格式完全匹配(错误,我的意思是几乎完全,根据下面的评论),以及“20000705”与“yyyy”不匹配。

要解析“20000705”,您需要使用其他技术 - ParseExact具有适当的格式字符串(如“yyyyMMdd”)或DateTime.Parse,这更宽容一些(虽然也不太准确)。

看起来你正试图从日期字符串中提取年份 - 没有解析方法会为你做这些。

相反,您应该获取字符串所代表的实际DateTime - 2000年7月5日或2000年5月7日,具体取决于您的格式 - 然后使用DateTime.Year提取年份。

答案 2 :(得分:0)

DateTime可以代表的最高日期是9999年12月31日。您要求它理解大于9999的年份。您需要指定与您提供的值匹配的格式,以便它理解只有前4位是年份。例如,“yyyymmdd”。