TimeSpan для разных лет вычитается из большего TimeSpan - PullRequest
4 голосов
/ 09 февраля 2011

Я использую язык C #.

У меня есть следующая дилемма.

DateTime A, DateTime B. Если A Например:

Количество дней в TimeSpan за 2009 год * коэффициент за 2009 год + Число дней в TimeSpan за 2010 год * показатель за 2010 год+ и т. д.

Ответы [ 3 ]

6 голосов
/ 09 февраля 2011

Вы не можете сделать это с простым TimeSpan, в принципе.Он ничего не знает о , когда охватывает диапазон - это просто число тиков, на самом деле.

Мне кажется, что есть два случая, которые вы должны рассмотреть:

  • А и В в одном году.Это легко - просто вычтите одно из другого и получите количество дней, в течение которых
  • A и B находятся в разных годах.Сейчас есть два или три случая:
    • Количество дней после A в году A.Вы можете решить это, построив 1 января в следующем году, затем вычтя A
    • Количество дней в каждом году полностью между A и B (так что если A в 2008 году и B в 2011 году, это будетбыть 2009 и 2010)
    • Количество дней в году Б.Вы можете решить это, построив 31 декабря в предыдущем году, затем вычтя B. (Или, возможно, 1 января в году B, в зависимости от того, хотите ли вы считать день B включен или нет.)

Вы можете использовать DateTime.IsLeapYear, чтобы определить, имеет ли какой-либо конкретный год 365 или 366 дней.(Я предполагаю, что вы используете только григорианский календарь, кстати. Все это меняется, если нет!)

3 голосов
/ 09 февраля 2011

Вот небольшой фрагмент кода, который может помочь

    var start = new DateTime(2009, 10, 12);
    var end = new DateTime(2014, 12, 25);

    var s = from j in Enumerable.Range(start.Year, end.Year + 1 - start.Year)
            let _start = start.Year == j ? start : new DateTime(j, 1, 1)
            let _end = end.Year == j ? end : new DateTime(j, 12, 31)
            select new { 
                year = j,
                days = Convert.ToInt32((_end - _start).TotalDays) + 1                    
            };
2 голосов
/ 09 февраля 2011

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

Скажите, если ваша дата начала где-то в 2008 году, а дата окончания - в 2010:

NDAYS(start, end) * coeff_2008  
- NDAYS(2009, end) * coeff_2008 + NDAYS(2009, end) * coeff_2009 
- NDAYS(2010, end) * coeff_2009 + NDAYS(2010, end) * coeff_2010

Где Ndays вычисляет количество дат в интервале (TotalDays плюс один день).

Нет необходимости специально обрабатывать високосные годы или вычислять 31 декабря.Детали, которые вы можете проработать в цикле for, проходящем январь каждого года в промежутке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...