我正在使用DateTime.TryParse()
函数来检查特定字符串是否是一个有效的日期时间,而不依赖于任何文化。
令我惊讶的是,该函数返回true
甚至是“1-1”,“1/1”。等的字符串。
我该如何解决这个问题?
更新
是否意味着,如果我想检查特定字符串是否是有效的日期时间,我需要一大堆格式?我相信会有不同的组合。
即使有很多日期分隔符('。','/',' - '等等)取决于文化,我也很难定义要检查的格式数组。
基本上,我想检查特定字符串是否包含至少一天(1到31或01到31),月份(1到12或01到12)和年份(yyyy或yy)的任何顺序,以及任何日期分隔符,什么是解决方案?
因此,如果值包含时间的任何部分,它也应该返回true。
我无法定义格式数组。
答案 0 :(得分:43)
如果您希望日期符合特定格式或格式,请使用DateTime.TryParseExact
,否则这是DateTime.TryParse
的默认行为
如果可能,此方法会尝试忽略无法识别的数据 使用当前信息填写缺少的月,日和年信息 日期。如果s只包含一个日期而没有时间,则此方法假设为 时间是午夜12:00。如果s包含带有的日期组件 两位数的年份,它被转换为当前文化中的一年 当前日历基于Calendar.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.
答案 1 :(得分:11)
如果要与特定日期格式匹配,请使用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");
}
答案 2 :(得分:6)
[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 的数组中指定您希望接受的日期时间格式。
答案 3 :(得分:6)
我用以下代码解决了这个问题:
protected bool CheckDate(String date)
{
try
{
DateTime dt = DateTime.Parse(date);
return true;
}
catch
{
return false;
}
}
答案 4 :(得分:0)
基本上,我想检查特定字符串是否包含至少一天(1到31或01到31),月份(1到12或01到12)和年份(yyyy或yy)的任何顺序,任何顺序日期分隔符,将是什么解决方案? 因此,如果值包含时间的任何部分,它也应该返回true。我无法定义格式数组。
当我处于类似情况时,我就是这样做的:
这http://www.codeproject.com/Articles/13255/Validation-with-Regular-Expressions-Made-Simple 对于理解和验证每种格式的语法都非常有用。
我的2美分,如果它有帮助......
答案 5 :(得分:0)
尝试使用
DateTime.ParseExact(
txtPaymentSummaryBeginDate.Text.Trim(),
"MM/dd/yyyy",
System.Globalization.CultureInfo.InvariantCulture
);
如果输入字符串格式不正确,则会抛出异常,因此在catch
部分中您可以return false;
答案 6 :(得分:0)
所以这个问题已得到解答,但对我来说,使用的代码不够简单或完整。对我来说,这就是我正在寻找的东西,可能还有其他人会喜欢这个。
if (DateTime.TryParse(DateString, out DateTime Temp) == true)
{
//do stuff
}
答案 7 :(得分:0)
另一种方法是创建一种方法来验证文本是否为日期类型。
public bool IsDateTime(string date)
{
if (string.IsNullOrEmpty(date)) return false;
return DateTime.TryParse(date, out DateTime dateTime);
}