2016-08-09 29 views
2

In einem Szenario, in dem Sie benötigen würde die nächsten ‚Rechnungsdatum‘, wenn der TAG (2., 25., usw.) ist bekannt, zu berechnen, wie kann man die Anzahl der Berechnung Tage bis zur nächsten Rechnungszahlung übrig?Berechnung Tage bis zum nächsten festgelegten Tag links

Erläuterung:

Tom Rechnung am 4. eines jeden Monats generiert wird

Was ist der beste Weg/Logik, um die Tage zu berechnen, bis die nächste Rechnung links? Zum Beispiel, wenn heute der 28. dieses Monats ist, wäre das Ergebnis 6 Tage links

Was wir wissen:

Bill Erstellungsdatum ist bekannt

Heutiges Datum ist bekannt

Was ich bisher getan habe:

int billingDay = 4; //The day the bill gets generated every month 
DateTime today = DateTime.Today; //Today's date 

Wie würde ich damit fortfahren, das nächste Rechnungsdatum zu berechnen?

PS: Sorry, wenn dies lahm klingt, ich konnte einfach nicht meinen Kopf wickeln um es

+0

Sie könnten diese posten finden, so nützlich: http://stackoverflow.com/questions/1607336/calculate-difference -between-two-dates-Anzahl der Tage –

+1

[DaysInMonth] (https: //msdn.microsoft.c om/de-de/library/system.datetime.daysinmonth (v = vs.110) .aspx) hilft Ihnen beim ersten Punkt. Erhalten Sie einfach die tatsächliche Anzahl der Tage im aktuellen Monat. Dann "Heutiges Datum - tatsächliche Zählung" und füge den Rechnungszeitraum hinzu. –

+0

Wow, liebe alle Antworten. Danke, dass du dir die Zeit genommen hast :) – Dinuka

Antwort

3

Ich denke, das funktioniert:

private int GetNumDaysToNextBillingDate(int billingDayOfMonth) 
{ 
    DateTime today = DateTime.Today; 

    if (today.Day <= billingDayOfMonth) 
    { 
     return (new DateTime(today.Year, today.Month, billingDayOfMonth) - today).Days; 
    } 
    else 
    { 
     var oneMonthFromToday = today.AddMonths(1); 

     var billingDateNextMonth = 
      new DateTime(oneMonthFromToday.Year, 
      oneMonthFromToday.Month, billingDayOfMonth); 

     return (billingDateNextMonth - today).Days; 
    } 
} 
+1

Ich persönlich bevorzuge diese, sie scheint alle Probleme zu behandeln, die von den Zuschauern aufgezeigt wurden. Danke Bro :) Danke auch an alle anderen für eure Lösungen! – Dinuka

+0

Gern geschehen! Obwohl es mehr Zeilen als einige der anderen Antworten gibt, ist es leichter zu verstehen, was auch wichtig ist. Es liest sich wie ein Buch. Einzeilige Anweisungen können ziemlich schnell verwirrend werden (besonders wenn sie umbrochen werden!). –

2

:) Wie wäre:

int billingDay = 4; 
DateTime today = DateTime.UtcNow; 
DateTime billing = today.Day >= billingDay 
        ? new DateTime(today.AddMonths(1).Year, today.AddMonths(1).Month, billingDay) 
        : new DateTime(today.Year, today.Month, billingDay); 
TimeSpan left = billing - today; 
+0

Was ist, wenn es das Ende des Jahres ist? –

+0

@roryap Große Beobachtung. Behoben. –

+1

Was ist, wenn heute der dritte Monat ist? – trailmax

1

Dieser Link könnte Ihnen helfen:

https://msdn.microsoft.com/en-us/library/system.datetime.daysinmonth(v=vs.110).aspx

Was Sie tun können, ist etwas wie dieses:

 int daysUntilBill = 0; 
     int billingDay = 4; 
     DateTime today = DateTime.Today; 
     if (billingDay > today.Day) { 
      daysUntilBill = billingDay - today.Day; 
     } else { 
      int daysLeftInMonth = DateTime.DaysInMonth(today.Year, today.Month) - today.Day; 
      daysUntilBill = billingDay + daysLeftInMonth; 
     } 

oder etwas prägnanter

 int daysUntilBill = (billingDay >= today.Day) 
      ? billingDay - today.Day 
      : billingDay + DateTime.DaysInMonth(today.Year, today.Month) - today.Day; 

Dieses Jahr richtig behandelt zu enden, da es sich nicht um zu wickeln nicht versuchen.

+0

Bei der Verwendung von 'DaysInMonth' sollten Sie kein fest codiertes Jahr verwenden. – juharr

+0

Guter Punkt, dumm von mir, das zu tun. Jetzt aktualisiert, danke! –

+1

funktioniert nicht für 1., 2. und 3. der Monate – trailmax

1

Zuerst bestimmen müssen, wenn das aktuelle Datum an oder vor dem Abrechnungstag ist, und wenn er den aktuellen Tag des Monats nur subtrahieren ist. Ansonsten müssen Sie das nächste Rechnungsdatum im Folgemonat festlegen.

public int DaysToNextBill(int billingDay) 
{ 
    var today = DateTime.Today; 

    if(today.Day <= billingDay) 
     return billingDay - today.Day; 

    var nextMonth = today.AddMonth(1); 
    var nextBillingDate = new DateTime(nextMonth.Year, nextMonth.Month, billingDay) 
    return (nextBillingDate - today).Days; 
} 

Das einzige, was bleibt, ist zu tun, wenn billingDay größer ist als die Anzahl der Tage im aktuellen oder folgenden Monat.

+0

Danke, dass du dir die Zeit genommen hast :) – Dinuka

1

Diese eine Schleife verwendet, ist aber weniger fehleranfällig, da es zu berücksichtigen Monat und Jahr Änderungen nimmt:

int DaysUntilBilling(int billingDay, DateTime referenceDate) 
    { 
     int count = 0; 
     while (referenceDate.AddDays(count).Day != billingDay) 
     { 
      count++;    
     }; 
     return count; 
    } 

Sie natürlich brauchen keinen Datetime in als Argument zu übergeben, wenn Sie immer sind mit dem heutigen Datum, aber dies hilft zu testen, dass das für verschiedene Eingaben, die gewünschte Ausgabe erhalten:

int billingDay = 4; 
DaysUntilBilling(billingDay, DateTime.Now); //26 (today is 9th Aug 2016) 
DaysUntilBilling(billingDay, new DateTime(2016, 09, 03); //1 
DaysUntilBilling(billingDay, new DateTime(2016, 09, 04); //0 
DaysUntilBilling(billingDay, new DateTime(2016, 08, 05); //30 
DaysUntilBilling(billingDay, new DateTime(2016, 12, 19); //16 
Verwandte Themen