Как проверить, находятся ли данные в диапазоне - PullRequest
3 голосов
/ 19 июня 2011

Мне было интересно, есть ли какой-нибудь удобный способ проверить, находятся ли данные в допустимом диапазоне. Я имею в виду, что в c # мы можем представлять данные с 0001-01-01 до (я думаю) 9999-01-01. Однако, если мы попытаемся сделать что-то подобное

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

Я получаю исключение. Есть ли какой-нибудь аккуратный способ проверить, можно ли выполнять операции DateTime (вычитание сложения и т. Д.)

Ответы [ 4 ]

3 голосов
/ 19 июня 2011

Просто используйте операторы сравнения (>, <,> =, <=, == и! =) </a>, так как они реализованы в 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 голосов
/ 19 июня 2011

Рассмотрим эти методы расширения.

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 голос
/ 19 июня 2011

Предварительная проверка переполнения в данной операции является громоздкой, и я не совсем уверен, что она действительно стоит того, чтобы просто обрабатывать exception.

Вы можете, например, сделать следующее при вычитании:

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

Стоит ли?Ваш звонок.

0 голосов
/ 19 июня 2011

Ознакомьтесь с документацией по структуре DateTime в MSDN.

В частности, вы можете взглянуть на:

  • TryParse и TryParseExact
  • Операторы сравнения
  • MinValue и MaxValue

Вы также можете поместить try..catch (ArgumentOutOfRangeException) вокруг значений DateTime, которые вы пытаетесь использовать.

Однако, если вы постоянно (или когда-либо?) Сталкивались с подобным исключением, я бы более внимательно посмотрел на ваш дизайн. Если вы не делаете какой-то серьезный перебор даты, я не знаю ни одного случая, когда я столкнулся бы с минимальным и максимальным значениями.

...