在c#中使用TryParseExact解析字符串到日期时间

本文关键字:字符串 日期 时间 TryParseExact | 更新日期: 2023-09-27 18:16:10

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

无法强制转换"System"类型的对象。DateTime' to type 'System。字符串'

我得到我的日期从出生日期文本字段在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 ?

在c#中使用TryParseExact解析字符串到日期时间

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

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());   
}

您可以检查您的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