从字符串无错误地解析日期时间

本文关键字:日期 时间 字符串 无错误 | 更新日期: 2023-09-27 18:03:19

我是c#新手,所以很可能这有一个相当简单的解决方案,但我还没有发现任何我认为优雅的东西。如果你需要任何额外的信息,或者对我的要求有任何困惑,请告诉我,我会尽快回复你。

当前创建验证规则的方式(当有人提交表单时),如下所示:

new ValidationRuleInstance<DetailsPresenter>(
    new IsValidDateRule<DetailsPresenter>(m => m.StartDate, "StartDate"),
    new ValidationRuleInterpretation(Severity.Failure, "StartDateMustBeValid", "Must enter valid start date (dd/mm/yyyy)")
),

我要做的是创建一个验证规则来检查我所给出的日期是否发生在过去。我想说的是:

new ValidationRuleInstance<DetailsPresenter>(
    new FailIfTrueRule<DetailsPresenter>(m => (DateTime.Parse(m.StartDate).AddDays(1) < DateTime.Now) ,"StartDate"),
    new ValidationRuleInterpretation(Severity.Failure, "StartDateCannotBeInThePast", "Your start date cannot be in the past")
),

This is works…大多数情况下(注:我添加了一天,以便输入当前日期不会产生错误)。

问题是,如果有人提交的字符串不能解析为日期时间对象(例如:725/2011而不是7/25/2011)整件事都爆炸了

我试过使用TryParse,但是它返回一个布尔值而不是一个时间-日期对象。

我要写我自己的方法来解析字符串,总是返回一个DateTime对象吗?我能捕获异常并忽略它吗?(已经有一个单独的规则来检查字符串是否有效)

从字符串无错误地解析日期时间

没有理由不能在lambda中使用多行代码块。您只需要将代码括在括号中并发出显式的return语句,而不是仅仅指定一个隐式返回其值的单个表达式。

new ValidationRuleInstance<DetailsPresenter>(
    new FailIfTrueRule<DetailsPresenter>(m => 
{
    DateTime value;
    if(DateTime.TryParse(m.StartDate, out value))
    {
        return value.AddDays(1) < DateTime.Now;
    }
    else // parsing failed, return whatever value is appropriate
    {
    }
} ,"StartDate"),
    new ValidationRuleInterpretation(Severity.Failure, "StartDateCannotBeInThePast", "Your start date cannot be in the past")
),

您应该能够按照如下方式编写lambda:

m => { DateTime d; return DateTime.TryParse(m.StartDate, out d) ? d.AddDays(1) < DateTime.Now : true; }