2016-05-10 14 views
0

Hallo Ich habe ein Problem gelöst, um einige Bibliothekstransparenz basierend auf Differenz zwischen Rückgabedatum und Fälligkeitsdatum in C# zu berechnen. Nun gibt es einige Einschränkungen für das Problem wieCalculate datetime difference in C#

wenn die Rückkehr Jahr d geändert wird wenn die Rückkehr Jahr größer ist als das Fälligkeitsdatum Kalenderjahr dann fein ist 10000. z.B. Fälligkeitsdatum "31/12/2015" und Rückgabedatum "01.01.2016" dann auch in Ordnung ist 10000.

Wenn der Rückgabemonat geändert wird, dann ist in Ordnung 500 * Anzahl der Monate zu spät.

Wenn der Rückkehrtag geändert wird, dann ist die Strafe 15 * Anzahl der Tage zu spät.

sonst in Ordnung ist 0.

Jetzt i die Funktion unten geschrieben:

static int CalcFine (int[] returnedOn, int[] dueOn) { 
    int returnD = returnedOn[0]; 
    int returnM = returnedOn[1]; 
    int returnY = returnedOn[2]; 
    int dueD = dueOn[0]; 
    int dueM = dueOn[1]; 
    int dueY = dueOn[2]; 

    if (returnY > dueY) { 
     return 10000; 
    } else if (returnY < dueY) { 
     return 0; 
    } else { 
     if (returnM > dueM) { 
      return (returnM - dueM) * 500; 
     } else if (returnM < dueM) { 
      return 0; 
     } else { 
      if (returnD > dueD) { 
       return (returnD - dueD) * 15; 
      } else { 
       return 0; 
      } 
     } 
    } 

} 

ich über die Datetime-Klasse in C# lesen, die recht ordentlich funktioniert hat, die den Unterschied in zwei Daten zurück, wie Gesamttage, Gesamtminuten, usw. Aber angesichts der Einschränkung von Fein basierend auf Jahr, Monat und Tagen, bin ich nicht sicher, ob es andere eingebaute Funktion zur Lösung des oben genannten Problems gibt. Kurz gesagt versuche ich herauszufinden, ob es noch einen einfachen Weg gibt, das obige Problem zu lösen, ohne so viele if-else zu verwenden.

+1

Das sieht aus wie die Hackerrank Frage aus 30-Tage-Code. Die 'DateTime'-Klasse ist mehr als ausreichend, um dieses Problem anzugehen. Woher weiß ich das? Weil ich es benutzt habe, um das zu lösen. – Tdorno

+0

Was ist, wenn Tag, Monat und Jahr alle geändert werden? Es ist möglich. – Saleem

+0

Sind die Parameter auch auf zwei int-Arrays beschränkt? –

Antwort

2

Sie können den Unterschied in Tagen, Stunden oder Minuten erhalten.

DateTime fromdate = new DateTime(2012,1,1); 
DateTime todate = DateTime.Now; 

TimeSpan diff = todate - fromdate; 
int differenceInDays = diff.Days; 

Wenn Sie für Ihre Validierungen und Geschäftsregeln anders ausprobieren möchten. Folgen Sie dem untenstehenden Code

public double GetFineAmount(DateTime DueDate) 
{ 
    DateTime dt = DateTime.Now; 
    int yeardiff, monthdiff, daydiff; 

    yeardiff = dt.Year - DueDate.Year; 
    if (yeardiff > 0) return 10000; 
    monthdiff = dt.Month - DueDate.Month; 
    if (monthdiff > 0) return 500 * monthdiff; 
    daydiff = dt.Day - DueDate.Day; 
    if (daydiff > 0) return 15 * daydiff; 
    return 0; 
} 
+0

Der Unterschied in Tagen ist sehr einfach mit der DateTime-Klasse. Aber meine Frage ist, seltsame Anwendungsfälle zu lösen, wo das Fälligkeitsdatum "31/12/2015" ist und das Rückgabedatum "01/01/2016" ist. In diesem Fall sollte die Ausgabe 10000 sein, da das Buch nach dem aktuellen Kalenderjahr zurückgegeben wird. Die diff.Days würden nur 1 Tag zurückgeben. – Naphstor

+0

@Naphstor Nun, Sie müssen natürlich mehr als nur den Unterschied zwischen den Daten verwenden. Aber 'DateTime' wird die Daten für Sie sauber behandeln. In dem Fall für Jahre würden Sie einfach schreiben: 'if (DateTime.Now.Year - checkoutDate.Year)> = 1)', etc. – Rob

+0

Dann müssen Sie etwas wie tun. Ich habe die Antwort aktualisiert – gayan1991

0

DateTime ist ein leistungsfähiges Werkzeug. Aber Sie wollen das nicht übermäßig komplizieren.

Wenn Sie nur den Unterschied zwischen den zwei Daten in Tagen finden, wird die Gleichung viel einfacher zu verwalten im Gegensatz zu versuchen, Daten zu subtrahieren.

static int CalcFine(DateTime returnedOn, DateTime dueOn) 
    { 

     TimeSpan dateDiff = (returnedOn - dueOn); 
     int TotalDays = dateDiff.Days; 
     if (TotalDays >= 365) 
     { 
      return 10000; 
     } 
     else if(TotalDays < 365 && TotalDays > 30 && TotalDays % 30 > 1) 
     { 
      return (500 * (TotalDays % 30)); 
     } 
     else if(TotalDays < 30 && TotalDays > 0) 
     { 
      return 15 * TotalDays; 
     } 
     else 
     { 
      return 0; 
     } 
    } 
+0

Ich dachte an diese Lösung, aber es wird in der Bedingung fehlschlagen, wo Fälligkeitsdatum ist "31/12/2015" und Rückgabedatum ist "01/01/2016".In diesem Fall sollte die Ausgabe 10000 sein, da das Buch nach dem aktuellen Kalenderjahr zurückgegeben wird. Obwohl unwirklich, aber sein Teil des Problems. – Naphstor

+0

Das stimmt nicht, der angegebene Code gibt 15 zurück. Er läuft von oben nach unten und prüft nicht, ob sich das Jahr geändert hat. Es überprüft einfach die Anzahl der Tage. In diesem Fall gibt die Zeitspanne 1 zurück. – Kramb

+1

@Kramb Ja, und was er sagt, ist, dass diese Lösung falsch ist. Die Voraussetzung ist, dass, wenn sich das Jahr ändert, es eine Geldstrafe von 10.000 ist, nicht wenn ein Jahr vergangen ist. Das Ergebnis sollte 10.000 sein, nicht 15. – Rob

1

Editiert wieder .. geändertes Zeichenmuster. Ich schätze, ich brauche etwas Schlaf ...

static int CalcFine (string returnedOn, string dueOn) 
    { 
     DateTime returnedDate = DateTime.ParseExact(
      returnedOn, "d M yyyy", CultureInfo.InvariantCulture); 
     DateTime dueDate = DateTime.ParseExact(
      dueOn, "d M yyyy", CultureInfo.InvariantCulture); 

     if (returnedDate < dueDate) 
      return 0; 
     if (returnedDate.Year > dueDate.Year) 
      return 10000; 
     if (returnedDate.Month > dueDate.Month) 
      return 500 * (returnedDate.Month - dueDate.Month); 
     if (returnedDate.Day > dueDate.Day) 
      return 15 * (returnedDate.Day - dueDate.Day); 
     else 
      return 0; 
    } 
+0

Ihr Code unterscheidet sich von Naphstors. Wenn beispielsweise das Rückgabedatum 2015-12-31 und das Fälligkeitsdatum 2016-1-1 lautet, gibt Naphstor 'code 0 zurück, aber Ihr Code gibt 5500 zurück. –

+0

Paolo, wenn das Rückgabedatum "2/7/2015" und Fälligkeitsdatum ist "1/1/2016", dann sollte die Ausgabe 0 sein. Mongo, mein Code gibt 10000 in dem von Ihnen erwähnten Anwendungsfall zurück. Da ich für das Jahr anders als in der ersten Bedingung überprüfe. – Naphstor

+0

@Naphstor Haben Sie diese Lösung versucht? Ich denke, dies erfüllt die Bedingungen, die Sie angegeben haben –