【发布时间】:2020-06-17 03:48:46
【问题描述】:
这是一个有效的方法:
/// <summary>
/// Checks date validity.
/// </summary>
/// <param name="candidate">String to check</param>
/// <returns>Whether valid and result as a date</returns>
private static Tuple<bool, DateTime?> ParseDate(string candidate)
{
DateTime result;
if(DateTime.TryParseExact(candidate, "dd.MM.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd.M.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd.MM.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "d.M.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd/M/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "d/M/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd.MM.yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd.M.yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd.MM.yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "d.M.yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd/MM/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd/M/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "dd/MM/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ||
DateTime.TryParseExact(candidate, "d/M/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result)
)
{
return new Tuple<bool, DateTime?>(true, result);
}
return new Tuple<bool, DateTime?>(false, null);
}
在那里添加大量的或分支对我来说似乎毫无用处。有什么更聪明的方法来做到这一点?我认为 DateTime.TryParse 会这样做,但它以 15.6.2020(过去的星期一)以某种方式失败并返回它不是有效日期。
是的,我知道那里有一百万个或分支丢失了。这也是我需要帮助的一个大问题。
【问题讨论】:
-
您是否尝试过使用适当的文化进行解析?似乎
"dd.M.yyyy"应该做到了——你在调试器中尝试过吗?如果您真的想使用所有这些格式字符串,请将它们放在一个集合中并使用 foreach (您需要重新安排您的逻辑,但这不应该那么难)。此代码适用于我 (DateTime.TryParseExact(candidate, "dd.M.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out var result);),输入为var candidate = "15.6.2020";。你会喜欢使用 - 这里的人坚持把月份数字放在第一位。 -
是的,我没注意到。好点子。生病删除我的评论
-
考虑将字符串分成三个部分并调用docs.microsoft.com/en-us/dotnet/api/…。 您可能需要特殊代码来处理 2 位数年份。
-
I thought DateTime.TryParse would do it, but it managed to somehow fail with 15.6.2020 (this past Monday) and return that it is not a valid date.请出示该代码。
标签: c# datetime string-parsing