C# 我有以下字符串;12-5“;而我';我试图在.NET中使用TryParse解析它。它返回true,如何为给定字符串设置false?
当将“12-5”或“12,5”作为.NET中DateTime.TryParse的输入时,它将其转换为“12-05-2020”,返回值为true。“12-5”如何等于“12-05-2020”?在我的例子中,输入字符串是用户的出生日期,根据要求是自由文本,解析值“12-05-2020”没有意义,因为出生日期不能是未来的日期。有没有一种方法可以在不使用DateTime.Parse或DateTime.ParseExact的情况下更正此问题,因为它们可能会引发异常 按照@Rafalon的建议,使用DateTime.TryParseExact避免异常,并设置所需的格式C# 我有以下字符串;12-5“;而我';我试图在.NET中使用TryParse解析它。它返回true,如何为给定字符串设置false?,c#,.net,validation,datetime-format,tryparse,C#,.net,Validation,Datetime Format,Tryparse,当将“12-5”或“12,5”作为.NET中DateTime.TryParse的输入时,它将其转换为“12-05-2020”,返回值为true。“12-5”如何等于“12-05-2020”?在我的例子中,输入字符串是用户的出生日期,根据要求是自由文本,解析值“12-05-2020”没有意义,因为出生日期不能是未来的日期。有没有一种方法可以在不使用DateTime.Parse或DateTime.ParseExact的情况下更正此问题,因为它们可能会引发异常 按照@Rafalon的建议,使用Date
string dateformat = "12-05";
bool answer = DateTime.TryParseExact(dateformat, "dd-MM-yyyy", CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out DateTime result);
嗯,您有两个测试要执行:
blablabla
不是一个)25-03-2123
不是一个)中检查这些要求,如果:
string userInput = "12-05-15"; // 12 May 2015
...
// We can use several formats in one go:
// DateTime.TryParseExact will try formats in the given order
string[] allowedFormats = new string[] {
"d-M-yy", "d-M-yyyy", "MMM d yyyy",
};
if (DateTime.TryParseExact(
userInput.Trim(), // let's tolerate leading/trailing whitespaces
allowedFormats,
CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.None,
out var result) &&
result <= DateTime.Today &&
result >= DateTime.Today.AddYears(-150)) {
// result is
// 1. Valid date
// 2. At least 150 years ago
// 3. At most today
}
else {
// userInput doesn't meet at least one criterium
}
string userInput=“12-05-15”;//2015年5月12日
...
//我们可以一次性使用多种格式:
//DateTime.TryParseExact将按给定顺序尝试各种格式
字符串[]allowedFormats=新字符串[]{
“d-M-yy”、“d-M-yyy”、“MMM-d-yyy”,
};
如果(DateTime.TryParseExact)(
userInput.Trim(),//让我们容忍前导/尾随空格
允许的格式,
CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.None,
输出风险值(var结果)和
结果=DateTime.Today.AddYears(-150)){
//结果是
//1.有效日期
//2.至少150年前
//3.今天最多
}
否则{
//userInput至少不符合一个标准
}
“没有意义,因为出生日期不能是未来的日期”-这不是你可以告诉TryParse的事情,我不认为:你必须在解析后验证你给出的日期。也许使用?然后将日期验证为Rup saidEven如果您使用纯文本字段作为输入,您仍然应该对您期望的格式有很好的理解(并将此信息提供给用户)。否则,您将得到例如欧洲和美国日期格式wrt月和日的混合:1985年4月3日可能意味着3月4日和4月3日。一旦你对你想要的格式有了一个想法,就用一个合适的解析器把它解析掉。@Rafalon,谢谢你的回复。请看,主要问题是我无法为验证指定任何固定格式。在我们的例子中,我们使用扫描的表单并从中获取书面值。因此,这限制了我使用tryparseexact,而您只需TryParse
,并希望它能够正确解析任何格式(请参见上面Sergey关于两个日期对应的相同书写日期的评论,具体取决于格式)。然后,如果解析成功,您可以在DmitryIn的第二个点中验证日期,而不是使用null
最好使用CultureInfo。InvariantCulture
因为null
表示当前区域性,它在不同的机器上会不同,因此可能导致不同的机器上出现不同的解析行为。@ckuri OK。谢谢。使用TryParseExact,我无法将字符串限制为某些特定格式。在我的例子中,字符串可以是任何格式,比如12-05-96、12-05-1996、12-05-1996以及用户过去给出的任何格式。我们正在处理历史数据,因此不能期望有固定的格式。Thanks@phanibnr:在这种情况下,您可以在单个TryParseExact
调用中提供多种格式。我已经编辑了答案