【问题标题】:Parsing String to DateTime with TryParseExact in C#在 C# 中使用 TryParseExact 将字符串解析为 DateTime
【发布时间】:2013-05-29 17:53:11
【问题描述】:

我查看了很多示例,并且按照他们的建议进行操作,但我不断收到 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?

【问题讨论】:

  • 错误提示value已经是DateTime对象
  • value 已经是一个日期时间。
  • 我以为通过 http post 表单发送的所有内容都是字符串?或者粘合剂为我做了一些聪明的工作? ://
  • 你是对的!您能否将其写为答案,以便我将问题标记为已回答。

标签: c# datetime tryparse


【解决方案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());   
}

【讨论】:

    【解决方案2】:

    您可以在尝试将其解析为 DateTime 之前检查您的 object value 是否属于 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
    

    【讨论】:

      猜你喜欢
      • 2011-07-18
      • 2011-11-26
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2013-11-21
      相关资源
      最近更新 更多