How do I calculate due date with whole months?

I'm trying to calculate the due date of an invoice, and I have a date of invoice, days to due date (100) and I need to calculate due date with whole months:

For example:
if date of invoice = 07/05/2009 and days of due date = 120, then the due date calculated = 07/09/2009 (4 months exactly -whole months-).
My code:
 
DateTime invoiceDate=System.DateTime.Now();
int numberOfDays=100;
int numberOfMonths;
int restOfNumberOfDays;
Date dueDate;
 
if(wholeMonths)
{
    numberOfMonths = numberOfDays % 30;
    dueDate = dt.AddMonths(numberOfMonths);
    restOfNumberOfDays = numberOfDays - (numberOfMonths * 30);
    dueDate = dueDate.AddDays(restOfNumberOfDays);
}
 
This code would be correct if the month had 30 days long.

Open in new window

ReaL10Asked:
Who is Participating?
 
CuteBugConnect With a Mentor Commented:
There is a DateDiff method in Visual Basic which returns the value in months.

Just go through this site for details
http://www.csharpfriends.com/Forums/ShowPost.aspx?PostID=52580

The decompiled code for DateDiff is provided there...

you need to convert it to C#.
Here is the code...
Public Shared Function DateDiff(ByVal Interval As DateInterval, ByVal Date1 As DateTime, ByVal Date2 As DateTime, ByVal Optional DayOfWeek As FirstDayOfWeek = 1, ByVal Optional WeekOfYear As FirstWeekOfYear = 1) As Long
Dim currentCalendar As Calendar
Dim span As TimeSpan = Date2.Subtract(Date1)
Select Case Interval
Case DateInterval.Year
currentCalendar = DateAndTime.CurrentCalendar
Return CLng((currentCalendar.GetYear(Date2) - currentCalendar.GetYear(Date1)))
Case DateInterval.Quarter
currentCalendar = DateAndTime.CurrentCalendar
Return CLng(((((currentCalendar.GetYear(Date2) - currentCalendar.GetYear(Date1)) * 4) + ((currentCalendar.GetMonth(Date2) - 1) / 3)) - ((currentCalendar.GetMonth(Date1) - 1) / 3)))
Case DateInterval.Month
currentCalendar = DateAndTime.CurrentCalendar
Return CLng(((((currentCalendar.GetYear(Date2) - currentCalendar.GetYear(Date1)) * 12) + currentCalendar.GetMonth(Date2)) - currentCalendar.GetMonth(Date1)))
Case DateInterval.DayOfYear, DateInterval.Day
Return CLng(Math.Round(Conversion.Fix(span.TotalDays)))
Case DateInterval.WeekOfYear
Date1 = Date1.AddDays(CDbl((0 - DateAndTime.GetDayOfWeek(Date1, DayOfWeek))))
Date2 = Date2.AddDays(CDbl((0 - DateAndTime.GetDayOfWeek(Date2, DayOfWeek))))
Return (CLng(Math.Round(Conversion.Fix(Date2.Subtract(Date1).TotalDays))) / 7)
Case DateInterval.Weekday
Return (CLng(Math.Round(Conversion.Fix(span.TotalDays))) / 7)
Case DateInterval.Hour
Return CLng(Math.Round(Conversion.Fix(span.TotalHours)))
Case DateInterval.Minute
Return CLng(Math.Round(Conversion.Fix(span.TotalMinutes)))
Case DateInterval.Second
Return CLng(Math.Round(Conversion.Fix(span.TotalSeconds)))
End Select
Throw New ArgumentException(Utils.GetResourceString("Argument_InvalidValue1", New String() { "Interval" }))
End Function 

Open in new window

0
 
CuteBugConnect With a Mentor Commented:
I think this is what they are doing for difference in months

private static int monthDifference(DateTime startDate, DateTime endDate)
{
int monthsApart = 12 * (startDate.Year - endDate.Year) + startDate.Month - endDate.Month;
return Math.Abs(monthsApart);
}

Open in new window

0
 
cauosConnect With a Mentor Commented:
there is an already method to add days to datetime objct in .Net, all what you have to do is add number of days to the method AddDays()

DateTime duedate = DateTime.Now
duedate = duedate.AddDays(120)

0
 
tcullerConnect With a Mentor Commented:
Well, if you want every month to be exactly 30 days, you could use the following method:
System.DateTime CalculateDueDate(System.Int32 myDaysUntilDue)
{
     return System.DateTime.Now.AddMonths(myDaysUntilDue / 30);
}

Open in new window

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.