2014-12-27 16 views
6

Also versuche ich herauszufinden, ob es eine andere Möglichkeit gibt zu überprüfen, ob ein Datum gültig ist. Die Idee ist also, dass, wenn das Datum gültig ist, es das gegebene Datum weiter verwendet, wenn das Datum ungültig ist, das Datum von heute verwendet.Nach einem gültigen Datum suchen

Das ist das, was ich im Moment hätte:

 public void setBirthdate(int year, int month, int day) 
     { 
     if (month < 1 || month > 12 || day < 1 || day > DateTime.DaysInMonth(year, month)) 
     { 
      Birthdate = DateTime.Today; 
     } 
     else 
      Birthdate = new DateTime(year, month, day); 
     } 

So gibt es eine kürzere/lesbare Weise, dies zu tun?

Vielen Dank im Voraus

+0

Schauen Sie sich die 'TryParseExact' Methode an. –

+0

DateTime.TryParse –

+0

Verwenden Sie 'try {Geburtsdatum = neue DateTime (Jahr, Monat, Tag); } catch {Birthdate = DateTime.Today;} ' – Avijit

Antwort

5

Sie die Werte einer gültigen DateTime konstruieren, dann die ArgumentOutOfRangeException fangen, um zu versuchen verwenden könnte, die, wenn die Argumente erfolgt außerhalb des Bereichs liegen:

public void setBirthdate(int year, int month, int day) 
{ 
    try 
    { 
     Birthdate = new DateTime(year, month, day); 
    } 
    catch (ArgumentOutOfRangeException) 
    { 
     Birthdate = DateTime.Today; 
    } 
} 

Einige mögen mit der Verwendung von Ausnahmen wie dieser nicht einverstanden sein, aber ich bin nur ich Die DateTime Klasse zu bearbeiten, macht ihre eigenen Prüfungen, anstatt sie selbst zu erstellen.

Vom documentation, ein ArgumentOutOfRangeException tritt auf, wenn:

  • Jahr weniger als 1 oder größer als 9999 ist, oder
  • Monat weniger als 1 oder größer als 12 oder
  • Tag weniger als 1 oder größer als die Anzahl der Tage im Monat.

Alternativ könnten Sie die Logik aus der DateTime Klasse kopieren: (reference)

public void setBirthdate(int year, int month, int day) 
{ 
    if (year >= 1 && year <= 9999 && month >= 1 && month <= 12) 
    { 
     int[] days = DateTime.IsLeapYear(year) 
      ? new[] { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365} 
      : new[] { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}; 

     if (day >= 1 && day <= days[month] - days[month - 1]) 
      Birthdate = new DateTime(year, month, day); 
    } 
    else 
     Birthdate = DateTime.Today; 
} 
+1

Ich stimme zu. Die Ausnahmebehandlung hat einen Overhead, aber Sie sollten immer Ihr gewähltes Framework nutzen. Die Wahrscheinlichkeit, dass Randfälle behandelt werden, die Sie nicht berücksichtigt haben, ist hoch. Sie können die Fangfunktion immer weiter verarbeiten, um die Werte in Richtung Ihres Anwendungsfalls zu biegen. –

1

Try this:

public void setBirthdate(int year, int month, int day) 
{ 
    try 
    { 
     Birthdate = new DateTime(year, month, day); 
    } 
    catch (Exception ex) 
    { 
     Birthdate = DateTime.Now; 
    } 
} 
2

ich die TryParse (MSDN) Methode über Ausnahme abfangen verwenden würden (die hoch oben sein kann, wenn genannt häufig mit ungültigen Werten):

DateTime date; 
if (DateTime.TryParse(string.Format("{0}-{1}-{2}", year, month, day), out date)) 
{ 
    // Date was valid. 
    // date variable now contains a value. 
} 
else 
{ 
    // Date is not valid, default to today. 
    date = DateTime.Today; 
} 
+0

Persönlich habe ich das Gefühl, dass TryParse mit seinem out-Parameter kognitiv schwerer ist und ich für meine Produktivität optimiere, also benutze ich einen try/catch und protokolliere die Ausnahmen. Wenn es ein wiederkehrendes Problem mit der Eingabe gibt, füge ich das erste Parsing vor der Objektkonstruktion hinzu. Ausnahmebehandlung bedeutet für mich, dass ich mich nicht in verfrühte Optimierung verstricke. –

0
protected DateTime CheckDate(String date) 
{ 
    DateTime dt; 
try{ 
    dt = DateTime.Parse(date); 

}catch(Exception ex){ 
    dt = DateTime.now(); 
    // may raise an exception 
} 
    finally{ 
     return dt; 
    } 
} 
Verwandte Themen