2014-12-27 15 views
6

Quindi sto cercando di capire se esiste un altro modo per verificare se una data è valida. Quindi l'idea è che se la data è valida allora continua ad usare la data data, se la data non è valida si usa la data di oggi.Verifica di una data valida

Questo è quello che ho ottenuto in questo momento:

 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); 
     } 

Quindi non v'è alcun/modo più leggibile più breve di fare questo?

Grazie in anticipo

+0

Dai un'occhiata al metodo 'TryParseExact'. –

+0

DateTime.TryParse –

+0

usare 'try {Birthdate = new DateTime (year, month, day); } catch {Birthdate = DateTime.Today;} ' – Avijit

risposta

5

È potrebbe utilizzare i valori per provare a costruire una valida DateTime, poi prendere il ArgumentOutOfRangeException che si verifica se gli argomenti sono fuori portata:

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

Alcuni possono non essere d'accordo con l'utilizzo di eccezioni come questa, ma io sono solo l la classe DateTime esegue i propri controlli, invece di ricrearli personalmente.

Dal documentation, un ArgumentOutOfRangeException si verifica se:

  • anno è minore di 1 o maggiore di 9999, o
  • mese è minore di 1 o maggiore di 12, o
  • Day è meno di 1 o maggiore del numero di giorni nel mese.

alternativa, è possibile copiare la logica dalla classe DateTime: (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

Accetto. La gestione delle eccezioni ha un overhead, ma dovresti sempre sfruttare il framework scelto. La probabilità che gestisca casi limite che non hai considerato è alta. Puoi sempre eseguire un'ulteriore elaborazione nel fermo per piegare i valori verso il tuo caso d'uso. –

1

Prova questo:

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

vorrei utilizzare il metodo TryParse (MSDN) su un'eccezione di cattura (che può essere alta in testa se chiamati spesso con valori non validi):

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

Personalmente, mi sento come TryParse con il suo parametro out è cognitivamente più pesante e ottimizzo per la mia produttività, quindi uso un try/catch e registro le eccezioni. Se c'è un problema ricorrente con l'input, aggiungo l'analisi iniziale prima della costruzione dell'oggetto. Per me, la gestione delle eccezioni riguarda il fatto di non impantanarmi nell'ottimizzazione prematura. –

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; 
    } 
} 
Problemi correlati