【问题标题】:Parsing Datetime from a string without errors从没有错误的字符串中解析日期时间
【发布时间】:2011-07-25 23:00:47
【问题描述】:

我是 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")
),

这是可行的……大多数时候(附注:我要添加一天,以便输入当前日期不会产生错误)。

问题在于,如果有人提交了一个无法解析为日期时间对象的字符串(例如 725/2011 而不是 7/25/2011),那么整个事情就会崩溃。

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

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

【问题讨论】:

  • TryParse 确实返回了一个 DateTime 对象,它是作为输出参数的第二个参数。您的用途如MSDN DateTime 所述。它就像 DateTime.TryParse("7/25/2011", out date)
  • 只是一个评论:你可以使用.AddDays(1) &lt; DateTime.Now,而不是&lt; DateTime.Today

标签: c# datetime


【解决方案1】:

没有理由不能在 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")
),

【讨论】:

  • 非常酷!到目前为止,我看到的例子只是一个衬里,但这是有道理的。感谢您的回答!
【解决方案2】:

您应该能够如下编写 lambda:

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

【讨论】:

  • 最后应该是false吗?
  • @Jon Egerton:规则是FailIfTrue,所以我认为它应该为无效日期返回true,因为那样它将失败。 OP 可以用任何合适的值替换它。 :)
  • 我喜欢你的回答并且可能会使用它,但亚当的回答教会了我一些我不知道的东西并回答了这个问题,所以他得到了布朗尼积分:P。
  • @Sumason:不用担心,没关系。请注意,我的版本也是一个多语句 lambda;我只是没有在里面放换行符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
相关资源
最近更新 更多