我正在寻找一种方法来计算两个日期之间的日期数量,每月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)
答案 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 :(得分: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;
}