如何检查数据是否在范围内?

3

我想知道是否有一种简便的方法来检查数据是否在允许的范围内。我的意思是,在C#中,我们可以表示从0001-01-01到(我认为)9999-01-01的数据。然而,如果我们尝试做这样的事情

 DateTime result = DateTime.Parse("0001-01-01").Subtract(TimeSpan.FromDays(1)) 

我遇到了一个异常。有没有简洁的方法来检查是否可以进行日期时间操作(加减等)?


1
这取决于操作。你想要实现什么? - SLaks
1
除非这是一次学术讨论,否则我建议您仔细检查任何涉及到最小或最大日期时间值的设计。 - Wonko the Sane
4个回答

3

只需使用DateTime中实现的比较运算符(>,<,>=,<=,==和!=)即可。

示例:

DateTime lowerAllowedDate = new DateTime(1,1,1); // 01/01/0001
DateTime upperAllowedDate = new DateTime(3000, 12, 31) // 31/12/3000
DateTime now = DateTime.Now
if (lowerAllowedDate <= now && now < upperAllowedDate) 
{
   //Do something with the date at is in within range
} 

2
考虑使用这些扩展方法。
public static class ValidatedDateTimeOperations
{
  public static bool TrySubtract (this DateTime dateTime, TimeSpan span, out DateTime result)
  {
    if (span < TimeSpan.Zero)
       return TryAdd (dateTime, -span, out result);
    if (dateTime.Ticks >= span.Ticks)
    {
       result = dateTime - span;
       return true;
    }
    result = DateTime.MinValue;
    return false;
  }
  public static bool TryAdd (this DateTime dateTime, TimeSpan span, out DateTime result)
  {
    if (span < TimeSpan.Zero)
       return TrySubtract (dateTime, -span, out result);
    if (DateTime.MaxValue.Ticks - span.Ticks >= dateTime.Ticks)
    {
       result = dateTime + span;
       return true;
    }
    result = DateTime.MaxValue;
    return false;
  }
}

这段内容可以这样称呼:

可以这样调用:

DateTime result;
if (DateTime.MinValue.TrySubtract (TimeSpan.FromDays(1), out result)
{
   // Subtraction succeeded.
}

1

事先检查给定操作是否会溢出很麻烦,而且我不确定这样做是否真的值得,与简单处理 exception 相比。

例如,在减法时,您可以执行以下操作:

 DateTime date;
 TimeSpan subtractSpan;
 if ((date - DateTime.MinValue) < subtractSpan)
 {
      //out of range exception: date - subtractSpan
 }

值得吗?由你决定。


0

请查看 MSDN 上的 DateTime 结构文档。

具体来说,您可以查看以下内容:

  • TryParse 和 TryParseExact
  • 比较运算符
  • MinValue 和 MaxValue

您还可以在试图使用 DateTime 值时放置 try..catch (ArgumentOutOfRangeException)。

然而,如果您一直(或曾经)遇到此类异常,我建议您更仔细地检查您的设计。除非您正在进行一些严格的日期计算,否则我不知道在哪种情况下会遇到最小值和最大值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接