使用DateTime.TryParse检查字符串是否为有效日期
本文关键字:是否 有效日期 字符串 检查 DateTime TryParse 使用 | 更新日期: 2023-09-27 18:10:00
我使用DateTime.TryParse()
函数来检查特定字符串是否是有效的日期时间,而不依赖于任何区域性。
令我惊讶的是,该函数返回true
为偶数字符串,如"1-1","1/1"等。
我该如何解决这个问题?
更新:这是否意味着,如果我想检查一个特定的字符串是否有效的日期时间,我需要一个巨大的格式数组??我相信会有不同的组合。
即使有很多日期分隔符('。', '/', '-'等),这取决于文化,我很难定义要检查的格式数组。
基本上,我想检查一个特定的字符串是否以任何顺序包含至少天(1到31或01到31),月(1到12或01到12)和年(yyyy或yy),使用任何日期分隔符,解决方案是什么?
因此,如果值包含时间的任何部分,它也应该返回true。我不能定义一个数组格式
如果您希望您的日期符合一个或多个特定格式,则使用DateTime.TryParseExact
,否则这是DateTime.TryParse
的默认行为
DateTime。TryParse
此方法尝试忽略无法识别的数据,如果可能的话将缺少的月、日、年信息填入当前日期。如果s只包含日期而不包含时间,则此方法假定为现在是午夜12点。If s包含一个带有a的日期组件两位数年份,则转换为当前文化中的年份基于日历值的当前日历。TwoDigitYearMax财产。s中的任何前导、内部或尾随空格字符将被忽略。
如果你想确认多种格式,那么查看DateTime。TryParseExact Method (String, String[], IFormatProvider, DateTimeStyles, DateTime)重载。来自同一链接的示例:
string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt",
"MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss",
"M/d/yyyy hh:mm tt", "M/d/yyyy hh tt",
"M/d/yyyy h:mm", "M/d/yyyy h:mm",
"MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm"};
string[] dateStrings = {"5/1/2009 6:32 PM", "05/01/2009 6:32:05 PM",
"5/1/2009 6:32:00", "05/01/2009 06:32",
"05/01/2009 06:32:00 PM", "05/01/2009 06:32:00"};
DateTime dateValue;
foreach (string dateString in dateStrings)
{
if (DateTime.TryParseExact(dateString, formats,
new CultureInfo("en-US"),
DateTimeStyles.None,
out dateValue))
Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
else
Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
}
// The example displays the following output:
// Converted '5/1/2009 6:32 PM' to 5/1/2009 6:32:00 PM.
// Converted '05/01/2009 6:32:05 PM' to 5/1/2009 6:32:05 PM.
// Converted '5/1/2009 6:32:00' to 5/1/2009 6:32:00 AM.
// Converted '05/01/2009 06:32' to 5/1/2009 6:32:00 AM.
// Converted '05/01/2009 06:32:00 PM' to 5/1/2009 6:32:00 PM.
// Converted '05/01/2009 06:32:00' to 5/1/2009 6:32:00 AM.
如果要匹配特定的日期格式,请使用DateTime.TryParseExact()
string format = "ddd dd MMM h:mm tt yyyy";
DateTime dateTime;
if (DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture,
DateTimeStyles.None, out dateTime))
{
Console.WriteLine(dateTime);
}
else
{
Console.WriteLine("Not a date");
}
[TestCase("11/08/1995", Result= true)]
[TestCase("1-1", Result = false)]
[TestCase("1/1", Result = false)]
public bool IsValidDateTimeTest(string dateTime)
{
string[] formats = { "MM/dd/yyyy" };
DateTime parsedDateTime;
return DateTime.TryParseExact(dateTime, formats, new CultureInfo("en-US"),
DateTimeStyles.None, out parsedDateTime);
}
只需在名为formats的数组中指定您希望接受的日期时间格式。
所以这个问题已经回答了,但对我来说使用的代码不够简单或完整。对我来说,这是我一直在寻找的东西,可能其他一些人也会喜欢这个。
string dateString = "198101";
if (DateTime.TryParse(dateString, out DateTime Temp) == true)
{
//do stuff
}
输出存储在Temp
中,之后不需要,datestring
是要测试的输入字符串
另一种方法是创建一个方法来验证文本是否为Date类型。
public bool IsDateTime(string date)
{
if (string.IsNullOrEmpty(date)) return false;
return DateTime.TryParse(date, out DateTime dateTime);
}
基本上,我想检查一个特定的字符串是否以任何顺序包含至少天(1到31或01到31),月(1到12或01到12)和年(yyyy或yy),使用任何日期分隔符,解决方案是什么?因此,如果值包含时间的任何部分,它也应该返回true。我不能定义一个数组格式。
当我遇到类似的情况时,我是这样做的:
- 收集我的系统期望支持的所有格式。
- 看什么是共同的或可以概括。
- 学会创建REGEX(最初这是一个时间投资,但一旦你自己创建了一个或两个就会得到回报)。也不要尝试一次性为所有格式构建REGEX,遵循增量过程。
- 我创建了REGEX来覆盖尽可能多的格式。
- 在少数情况下,为了不使REGEX过于复杂,我通过DateTime.Parse()方法来覆盖它。
- 通过Parse和REGEX的结合,我能够验证输入是否正确/如预期的那样。
对于理解和验证每种格式的语法都非常有帮助。
如果有帮助的话,我的两分钱....
尝试使用
DateTime.ParseExact(
txtPaymentSummaryBeginDate.Text.Trim(),
"MM/dd/yyyy",
System.Globalization.CultureInfo.InvariantCulture
);
如果输入字符串格式不正确,则抛出异常,因此在catch
部分中,您可以return false;