C# 是否将无效日期处理为有效日期?
我有下面的方法,它可以正确地处理一个真正的无效/有效日期,但是,如果我遇到一个空字符串或一个带有掩码的日期,例如_/__/___;,我希望将它们作为有效的传递,但是DateTime.TryParse会使它们无效。我如何修改下面的方法来传递我的无效场景?以下方法是一个示例程序:C# 是否将无效日期处理为有效日期?,c#,parsing,datetime,C#,Parsing,Datetime,我有下面的方法,它可以正确地处理一个真正的无效/有效日期,但是,如果我遇到一个空字符串或一个带有掩码的日期,例如_/__/___;,我希望将它们作为有效的传递,但是DateTime.TryParse会使它们无效。我如何修改下面的方法来传递我的无效场景?以下方法是一个示例程序: public bool ValidateDate(string date, out string message) { bool success = true; message = string.Empty
public bool ValidateDate(string date, out string message)
{
bool success = true;
message = string.Empty;
DateTime dateTime;
if(DateTime.TryParse(date,out dateTime))
{
success = false;
message = "Date is Invalid";
}
return success;
}
void Main()
{
//The only date below that should return false is date4.
string date = "01/01/2020";
string date2 = "";
string date3 = "__/__/____";
string date4 = "44/__/2013";
string message;
ValidateDate(date, out message); //Should return true
ValidateDate(date2, out message); //Should return true
ValidateDate(date3, out message); //Should return true
ValidateDate(date4, out message); //Should return false
}
我不能把它改成如果!TryParsedate3,out DateTime,因为对于我想要验证的日期,这将返回false
我也试着做一些类似“如果”!date3.contains&&DateTime.TryParsedate3,out DateTime,但仍然失败。我应该颠倒验证的顺序吗?问题是,我不仅仅在第一个无效日期返回false,我正在构建一个包含所有无效日期的StringBuilder,然后返回该值,所以我没有想到:
if(DateTime.TryParse(date3,out dateTime))
return true;
else
return true;
public bool ValidateDate(string date, out string message)
{
string[] overrides = {"","__/__/____"};
bool success = true;
message = string.Empty;
DateTime dateTime;
if(!overrides.Contains(date) && !DateTime.TryParse(date,out dateTime))
{
success = false;
message = "Date is Invalid";
}
return success;
}
在运行DateTime.TryParse方法之前,您可以只查看覆盖数组吗
在运行DateTime.TryParse方法之前,您可以只查看覆盖数组吗
有很多方法可以剥这只猫的皮。我想这取决于您希望将多少无效数据视为有效数据。此外,DateTime.TryParse将考虑当前的区域性设置,所以您也应该这样做吗
bool ValidateDate(string date, out string message)
{
message = string.Empty;
if (date == null)
return true;
const string mask = "_";
var separator = CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator;
var test = date.Replace(mask, string.Empty).Replace(separator, string.Empty);
if (string.IsNullOrWhiteSpace(test))
return true;
DateTime dateTime;
if (!DateTime.TryParse(date, out dateTime))
{
message = "Date is Invalid";
return false;
}
return true;
}
我想你也可以用正则表达式来做。有很多有效的解决办法。有很多方法可以剥这只猫的皮。我想这取决于您希望将多少无效数据视为有效数据。此外,DateTime.TryParse将考虑当前的区域性设置,所以您也应该这样做吗
bool ValidateDate(string date, out string message)
{
message = string.Empty;
if (date == null)
return true;
const string mask = "_";
var separator = CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator;
var test = date.Replace(mask, string.Empty).Replace(separator, string.Empty);
if (string.IsNullOrWhiteSpace(test))
return true;
DateTime dateTime;
if (!DateTime.TryParse(date, out dateTime))
{
message = "Date is Invalid";
return false;
}
return true;
}
我想你也可以用正则表达式来做。有很多有效的解决方案。几乎可以肯定,您必须编写一个正则表达式来处理此问题。请看这里:@yack-我想到了正则表达式。你能提供一个答案吗?你几乎肯定要写一个正则表达式来处理这个问题。看看这里:@恶心-我想到了正则表达式。你能提供一个答案吗?我想你可能是对的。我什么都试过了,所以我要试一试。错过一个!第二if@MattJohnson-效果很好,我只是做了一点小小的修改,因为我处理其他验证,我不能只返回一个成功的日期,所以看看更新的方法,让我知道它是否看起来不错?所以。。。如果一个日期被成功解析,你想失败吗?是的,我只是从原始帖子复制粘贴了两行,我想你可能是对的。我什么都试过了,所以我要试一试。错过一个!第二if@MattJohnson-效果很好,我只是做了一点小小的修改,因为我处理其他验证,我不能只返回一个成功的日期,所以看看更新的方法,让我知道它是否看起来不错?所以。。。如果一个日期被成功解析,你想失败吗?是的,我刚从原始帖子中复制并粘贴了两行扫描,你能详细介绍一下文化吗?我的日期将以en-US文化存储,而不考虑文化?存储为DateTime,文化不重要。但作为弦,它们确实如此。您如何知道用户将输入mm/dd/yyyy或dd/mm/yyyy?你确定分隔符总是一个正斜杠,还是一个破折号或句号?如果今年是第一年呢?如果你想了解文化,那么你必须考虑这些事情。如果您要锁定特定的区域性,那么您可能应该使用TryParseExact并将格式和区域性传递进来。您能详细介绍一下区域性吗?我的日期将以en-US文化存储,而不考虑文化?存储为DateTime,文化不重要。但作为弦,它们确实如此。您如何知道用户将输入mm/dd/yyyy或dd/mm/yyyy?你确定分隔符总是一个正斜杠,还是一个破折号或句号?如果今年是第一年呢?如果你想了解文化,那么你必须考虑这些事情。如果要锁定特定的区域性,那么可能应该使用TryParseExact并将格式和区域性传递进来。