DateTime的字符串,TryParse不够

问题描述 投票:0回答:2

这是一种有效的方法:

        /// <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(在过去的星期一)失败,并返回了一个无效的日期。

是的,我知道那里有100万个分支机构。这也是我需要帮助的一个大问题。

c# datetime string-parsing
2个回答
2
投票

日期格式很多,有些是自定义的,这就是为什么您需要指定将接受的有效格式。如果您可以在用户界面中验证格式或限制可接受的格式(如果日期来自某种手动输入),将很有帮助。在DateTime.TryParseExact中,有一个接受字符串格式数组的重载,请参见here


0
投票

使用正则表达式匹配字符串格式。像

之类的东西
public bool IsStringDate(string candidate){

    var dateRegex = new Regex("^([0]\d|[1][0-2])\/([0-2]\d|[3][0-1])\/([2][01]|[1][6-9])\d{2}(\s([0-1]\d|[2][0-3])(\:[0-5]\d){1,2})?$");

    return dateRegex.Match(candidate).Success;
}
© www.soinside.com 2019 - 2024. All rights reserved.