这很奇怪。我有以下代码:
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]我想这是我的错......当问题出现时我将不得不截断输入。幸运的是,我通常在格式中包含日期的所有部分,这(仅一年)是罕见的。谢谢你的帮助。
答案 0 :(得分:2)
失败是绝对正确的 - 你已经告诉它要完全预期4个字符,然后给它8个!
选项:
你声称截断字符串“会在其他地方失败” - 你能提供更多细节吗?如果你指定“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”。