使用C#中的TryParseExact将字符串解析为DateTime

时间:2013-05-29 17:53:11

标签: c# datetime tryparse

我看了很多例子,而且我正在按照他们的建议做,但我一直得到一个InvliadCastException错误描述:

  

无法将'System.DateTime'类型的对象强制转换为'System.String'

我从ASP.NET MVC4应用程序中的出生日期文本字段中获取日期,格式如下20/09/1986

这是我的代码,我只希望18岁以上的用户能够注册。

public class AgeValidator : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        string format = "dd/MM/yyyy HH:mm:ss";
        DateTime dt;
        DateTime.TryParseExact((String)value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);


        DateTime today = DateTime.Today;
        int age = today.Year - dt.Year;
        if (dt > today.AddYears(-age)) age--;

        if (age < 18)
        {
            return false;
        }

        return true;
    }
}

然后使用我的自定义验证:

[Required]
[Display(Name = "Date Of Birth")]
[AgeValidator(ErrorMessage="You need to be at least 18 years old to vote.")]
public DateTime DateOfBirth { get; set; }

如何正确解析DateTime?

2 个答案:

答案 0 :(得分:1)

这听起来像是一个使用重载方法的好地方:

public override bool IsValid(DateTime value)
{
    DateTime today = DateTime.Today;
    int age = today.Year - value.Year;
    if (value > today.AddYears(-age)) age--;

    if (age < 18)
    {
        return false;
    }

    return true;
}

public override bool IsValid(string value)
{
    string format = "dd/MM/yyyy HH:mm:ss";
    DateTime dt;
    if (DateTime.TryParseExact((String)value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
    {
        return IsValid(dt);
    }
    else
    {
        return false;
    }

}

public override bool IsValid(object value)
{
    return IsValid(value.ToString());   
}

答案 1 :(得分:0)

在尝试将object value解析为DateTime之前,您可以检查DateTime是否属于if(value == null) { throw new ArgumentNullException("value"); } DateTime dt ; if(value is DateTime) { dt = (DateTime)value; } else { string format = "dd/MM/yyyy HH:mm:ss"; DateTime.TryParseExact(value.ToString(), format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt); } //rest of your code 类型:

{{1}}