2010-05-18 5 views
1

У меня небольшая проблема с приведенным ниже кодом, переменная «дней» всегда кажется 0 независимо от того, насколько далеки друг от друга дни.C# Количество дней между двумя заданиями даты

Вы видите что-то явно не так?

 System.TimeSpan span = dates[0] - dates[1]; // e.g. 12/04/2010 11:44:08 and 18/05/2010 11:52:19 
     int days = (int)span.TotalDays; 

     if (days > 10) //days always seems to be 0 
     { 
      throw new Exception("Over 10 days"); 
     } 

Благодаря

+0

Что делает ToString() на пролете сказать? –

+0

Исключение Eek, если входные значения неверны. Вы должны вернуть функцию с помощью boolean, если функция была выполнена успешно. – RvdK

+0

@RvdK, Прошло некоторое время с тех пор, как вы написали этот комментарий, но здесь вы совершенно не правы. Вы действительно НЕ должны подбрасывать код C# с проверкой ошибки возвращаемого значения. Для этого нужны исключения. Без исключений вы не можете цеплять вызовы методов и т. Д. Если вы действительно хотели бы подчеркнуть входную валидацию здесь, Джейми должен бросить ArgumentExceptions для значений, которые неприемлемы. – JonasW

ответ

4

Итоговые дни должны быть отрицательными, но ни в коем случае не нулевой, потому что вы вычитать более раннюю дату в более поздний срок. Кажется dates[0] и dates[1] не содержат того, что вы думаете.

+0

TimeSpans может быть отрицательным, так что это не будет точно 0. – Tesserex

+0

@Tesserex, спасибо за информацию. –

+0

-1: Это просто некорректно – Simon

0

Если мы предположим, что ваш код выглядит точно так, а массив дат правильно заполнен, то здесь нет ничего плохого, что приведет к тому, что дни будут равными нулю. Возможно, проверьте, что в вашем массиве дат есть правильные значения? Если учесть это, напишите больше кода?

5

Поскольку вы вычитаете более позднюю дату с более ранней даты, согласно вашим комментариям, TotalDays будет отрицательным. В вашем примере -36.

Поэтому сравнение (days > 10) не удастся. Вы должны использовать

int days = Math.Abs((int)span.TotalDays); 

Предполагая, что вы не установили дату [0] равно дату [1], нет никаких причин, почему TotalDays будет возвращать ноль для дат образца у вас есть в комментариях.

1

Я просто проверил это:

DateTime date1 = new DateTime(2010, 12, 31); 
DateTime date2 = new DateTime(2010, 1, 1); 

TimeSpan timeSpan = date2 - date1; 
Console.WriteLine(timeSpan.TotalDays); 

Эта программа выводит: -364. Поэтому он должен отлично работать! Один вопрос: Использовали ли вы DateTime[] для dates -array?

BTW: days > 10 не проверяет, days равно нулю.

0

Либо это сделать:

System.TimeSpan span = dates[0] - dates[1]; 
int days = Math.Abs((int)span.TotalDays); 

if (days > 10) 
{ 
    throw new Exception("Over 10 days"); 
} 

Или это:

System.TimeSpan span = dates[1] - dates[0]; 
int days = (int)span.TotalDays; 

if (days > 10) 
{ 
    throw new Exception("Over 10 days"); 
} 
Смежные вопросы