2009-04-20 25 views
0

Anforderungen:Wie berechnet man die Anzahl der Monate zwischen zwei DateTimes?

  • die Anzahl der Monate Berechnen zwischen zwei Daten: receiveDate und dueDate.
  • Beide optimistischen und pessimistischen Berechnungen
  • benötigt

Annahmen:

  • dueDate wird immer der letzte Tag des Monats sein.

Ich habe bereits die pessimistische Berechnung (dh einen einzigen Tag überfällig zählt als ein ganzer Monat herausgefunden.

if(receiveDate > dueDate) 
    receiveDate.Month - dueDate.Month + (receiveDate.Year - dueDate.Year) * 12; 

die Suche auf dem Internet mehr ähnlichen Beispiele aufgedreht, dies zu bestätigen

Nun sagen sie mir meine Instinkte die optimistische Berechnung wird nur die gleiche minus einen Monat, aber aus irgendeinem Grund ist es einfach nicht richtig an. bin ich auf dem richtigen Weg oder bin ich etwas fehlt?

+1

Verstehen Sie nicht die 'optimistisch/pessimistisch' Sache. Ist die Anzahl der Monate zwischen zwei Daten definiert als "die Anzahl der Monate, die zwischen den beiden Daten einen oder mehrere Tage haben"? In diesem Fall würde es nicht nur eine richtige Antwort geben. – mackenir

+0

Es kommt wirklich darauf an, wie Sie teilweise Monate sehen. In einem Fall werden Teilmonate ignoriert, im anderen werden sie wie ein ganzer Monat gezählt. –

Antwort

1

Sie haben Recht; Wenn Sie die Anzahl der vollständigen Monate zwischen den beiden Daten suchen, ziehen Sie 1 ab (vorausgesetzt, die receiveDate fällt nicht auf den letzten Tag des Monats, in diesem Fall haben Sie einen Rest von 0 Tagen oder so) Ich werde dir deine Antwort geben.

0

Wenn Sie nicht brauchen, Tage des Monats in Ihrem Kalkül zu halten, denke ich, es ist der Weg zu gehen.

0

Ihre Formel berechnet die Anzahl der Monate zwischen dem ersten Monat des receivedDates bis zum ersten des Monats des fälligen Datums. Da die meisten Zeitelemente in TimeSpan als TotalXXX ausgedrückt werden, erscheint es seltsam, dass sie TotalMonths und TotalYears auslassen.

Ich denke es ist, weil es keine feste Anzahl von Tagen von Monat zu Monat gibt, so ist es schwer zu wissen, was am sinnvollsten in Bezug darauf, wie der Bruchteil Rest auszudrücken ist.

Meine Formel ist dies ...

 

int nMonthDiff_FirstToFirst = DateTime.Now.Month - testDate.Month + ((DateTime.Now.Year - testDate.Year)* 12); 

double dMonthDiff = (double)nMonthDiff_FirstToFirst + (DateTime.Now - testDate.AddMonths(nMonthDiff_FirstToFirst)).TotalDays/(double)DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month); 
 

Also, was ich tun, ist im Grunde den Monat Unterschied bekommen, wie Sie (erste Tag des Monats zum ersten des Monats) sind dann projizieren ich meine Testdate in die Zukunft durch den Monatsunterschied. Dann bekomme ich mit dem TimeSpan die TotalDays und dividiere diese durch die Anzahl der Tage in diesem Monat. Also stelle ich den Bruchteil in Bezug auf die verbleibenden Tage des Monats dar.

Wenn Sie also am 5. Mai 2012 -> 3. Juni 2012 gehen würden, würde Ihre Formel für einen Monat einen Unterschied zurückgeben, wenn noch kein voller Monat vergangen ist. In meiner Formel würden die TotalDays des projizierten Datums eine negative Bruchteilzahl von Tagen ergeben, und wenn sie zu der "ersten bis ersten" Monatsdifferenz addiert würden, würde sie diese nach Bedarf aufnehmen.

0

Ich mache diese zusätzliche Kontrolle genaue Menge von Monaten zu erhalten:

NUMBEROFMONTHS = receiveDate.Month - dueDate.Month + (receiveDate.Year - dueDate.Year) * 12; if (receiveDate.Day> dueDate.Tag) numberOfMonths--;

0
int GetMonthsCount(DateTime dtStart, DateTime dtEnd) 
{ 
    return (int)Math.Round((dtEnd - dtStart).TotalMonths); 
} 
Verwandte Themen