计算两个日期之间的数字,所有月份= 30天

时间:2016-05-13 13:53:28

标签: c# .net date datetime

我正在寻找一种方法来计算两个日期之间的日期数量,每月30天(即使在二月,一月三十一日)。

SQL中有一些解决方案,但如果可能的话,我正在寻找c#中的解决方案。 好吗?

示例:(日期美国)

01/01/2016至05/31/2016 = 150天而不是150天。

因为在这种情况下有5个月,所以5 * 30 = 150。 在我的情况下,整个月都是基于30天。

其他示例:

2016年1月16日至2016年7月17日= 182代替183(15 + 30 + 30 + 30 + 30 + 30 + 17)

3 个答案:

答案 0 :(得分:1)

您尝试做的事情似乎与用于金融市场的日历相同。这是一个实施30E/360 ISDA计算方法的解决方案,因为它是在他们网站上提供的demo XLS中实现的(30/360天计数约定):

var start = new DateTime(2016, 1, 1);
var finish = new DateTime(2016, 05, 31);


var d1 = start.Day == 31 ? 30 : start.Day;
var d2 = finish.Day == 31 && (start.Day == 30 || start.Day == 31) ? 30 : finish.Day;
// actualDaysDiff will be 151 as expected
var actualDaysDiff = (finish - start).TotalDays;
// using the new method newDaysDiff will be 150
int newDaysDiff = ((360 * (finish.Year - start.Year)) + (30 * (finish.Month - start.Month)) + (d2 - d1));

我为你的另一个例子得到了正确的结果(我认为应该是181天)。

有关此主题的更多信息,请查看以下内容:

  1. 360-day calendar
  2. C# for Financial Markets

答案 1 :(得分:0)

试试这段代码

var months = endDate.Month - startDate.Month - 1;
var startDateDayes = 30 - startDate.Day;
startDateDayes =startDateDayes ==-1 ? 0 : startDateDayes;//for 31 month days
var endDateDayes = endDate.Day;
var totalDays = startDateDayes + endDateDayes + months * 30;
if (endDate.Year > startDate.Year)
{
    totalDays += 360 * (endDate.Year - startDate.Year);
}

希望有所帮助

答案 2 :(得分:-1)

public static int GetDays(DateTime start, DateTime end) {
    int newDaysDiff = ((360 * (end.Year - start.Year)) + (30 * ((end.Month - start.Month) == 0 ? 0 : (end.Month - start.Month) - 1)));
    int j = 0;
    if (start.Month == end.Month && start.Year == end.Year) {
        if (start.Day == 1 && end.Day == 31) {
            j = (end.Day - start.Day);
        }
        else {
            j = (end.Day - start.Day) + 1;
        }
    }
    else {
        if (start.Day == 1) {
            j = j + 30;
        }
        else {
            j = j + DateTime.DaysInMonth(start.Year, start.Month) - start.Day + 1;
        }
        if (end.Day == 30 || end.Day == 31) {
            j = j + 30;
        }
        else {
            j = j + end.Day;
        }
    }
    newDaysDiff = newDaysDiff + j;
    return newDaysDiff;
}