【发布时间】:2014-02-20 08:55:42
【问题描述】:
直到现在我还以为我会理解DateTime.ParseExact 的工作原理,但这令人困惑。为什么下面一行返回false?
DateTime.TryParseExact("2013122", "yyyyMdd", CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out lastUpdate)
月份也可以有两位数。在我看来,它应该能够理解这意味着 2013 年 1 月 22 日。为什么我走错了路?我错过了什么还是有简单的解决方法?
同时我正在使用这个不是很优雅但有效的解决方法:
public static DateTime? ParseDate_yyyyMdd(String date)
{
if (date == null)
return null;
date = date.Trim();
if (date.Length < 7)
return null;
if (date.Length == 7)
date = date.Insert(4, "0");
DateTime dt;
if (DateTime.TryParseExact(date, "yyyyMMdd", CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out dt))
return dt;
return null;
}
给出我想要的结果:
DateTime? date = ParseDate_yyyyMdd("2013122");
Console.Write(date.ToString()); // 01/22/2013
但是,我仍然对这种限制的原因感兴趣。也许有人也有更好的方法。
【问题讨论】:
-
我认为答案是正确的,但这对我来说仍然很奇怪。我不明白 widest 规则。你是说嘿,尝试将我的前 4 个字符解析为一年,1 个字符之后解析为一个月,2 个字符之后解析为一天。但是方法会忽略它。
-
.. 它说:
hey, your string doesn't have date separator, and that's why I ignore your format because it doesn't have widest form of your specifiers. -
如果您改用
""yyyyMd",它会解析,但解释错误,lastUpdate=2013/Dec/2。 -
您的解决方法可能不那么难看:
if (date.Length == 7) { date = date.Insert(4, "0"); } -
我就这个问题联系了 .NET Framework 团队,here their response。