2015-02-05 1 views
1

У меня 2 даты, начальные (1/1/15) конец (31/12/16)TimeSpan содержит leapyear

мне нужно вычислить количество в день от общей суммы (20000) и годовая сумма на основе 365 дней,

Я использую TimeSpan, чтобы получить дни между датами начала и окончания, но в этом случае она возвращает 731 (365 + 366) в 2006 високосный год,

но что мне нужно, чтобы получить 730 без високосного дня, есть ли способ сделать это

Thanks Aj

+0

Вы можете проверить, если ваши финики содержат скачок год, если это случай, то вычтите, что много дней из счета. –

+0

, но у меня есть диапазон между 2015, 2025 годами, 2016 и 2020 годы, мне хотелось избежать цикла, хотя каждый год –

+0

Являются ли эти даты всегда с 1 января по 31 декабря? Потому что, если это так, ответ, безусловно, будет просто «int days = 365 * (endYear - startYear + 1);' –

ответ

1

Возможно, есть более эффективный подход, но это работает, как ожидалось:

public static int DaysDiffMinusLeapYears(DateTime dt1, DateTime dt2) 
{ 
    DateTime startDate = dt1 <= dt2 ? dt1.Date : dt2.Date; 
    DateTime endDate = dt1 <= dt2 ? dt2.Date : dt1.Date; 
    int days = (endDate - startDate).Days + 1; 

    int daysDiff = Enumerable.Range(0, days) 
     .Select(d => startDate.AddDays(d)) 
     .Count(day => day.Day != 29 || day.Month != 2); 
    return daysDiff; 
} 

Ваш образец:

int days = DaysDiffMinusLeapYears(new DateTime(15, 1, 1), new DateTime(16,12,31)); 

Результат: 730

+0

Я думаю, что «+ 1» имеет решающее значение. Возможно, вы можете объяснить немного больше об этом и привести пример без високосного года. –

+0

@MareInfinitus: это только, чтобы включить дату окончания в расчет, в противном случае это будет исключено. Однако в настоящее время я не уверен, что этот ответ полезен, поскольку '(dt2-dt1) .Days' также возвращает 730, поэтому я больше не понимаю этот вопрос. –

+0

Вместо этого может быть проще использовать цикл 'for'. – Rawling

 Смежные вопросы

  • Нет связанных вопросов^_^