2014-12-27 42 views
6

Bu yüzden bir tarihin geçerli olup olmadığını kontrol etmenin başka bir yolu olup olmadığını anlamaya çalışıyorum. Öyleyse fikir şu ki, eğer tarih geçerliyse, tarih geçersizse bugünün tarihini kullanıyorsa, verilen tarihi kullanmaya devam eder.Geçerli bir tarih kontrol edin

Bu şu anda ne var olduğunu:

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

Yani bunu yapmanın herhangi kısa/daha anlaşılabilir bir yol var mıdır? peşin

Teşekkür

+0

'TryParseExact' yöntemine bir göz atın. –

+0

DateTime.TryParse –

+0

'try {Birthdate = new DateTime (yıl, ay, gün); } yakalamak {Birthdate = DateTime.Today;} ' – Avijit

cevap

5

Sen argümanları aralık dışında ise o zaman ortaya çıkar ArgumentOutOfRangeException yakalamak, geçerli bir DateTime inşa denemek için değerleri kullanabilirsiniz:

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

Bazıları bu gibi istisnaları kullanmaya katılmayabilir ancak ben sadece DateTime sınıfını kullanmak, kendimi yeniden oluşturmak yerine kendi kontrollerini yapar. documentation itibaren

, bir ArgumentOutOfRangeException olursa oluşur:

  • Yıl 9999 den az 1 veya daha büyüktür, ya
  • Ay 12'den 1'den daha az veya daha büyüktür, ya
  • Gün azdır ayda 1'den fazla veya daha büyük gün sayısı.

Alternatif olarak, DateTime sınıftan mantığı kopyalayabilirsiniz: (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

kabul ettiğimde yeni bir nesne oluştururken yapıcıdan gelir. İstisna işlemenin yükü vardır ancak seçtiğiniz çerçeveyi her zaman kullanmalısınız. Görmediğiniz kenar durumlarını ele alma olasılığı yüksektir. Değerleri kullanım durumunuza doğru bükmek için her zaman yakalama işleminde daha fazla işlem yapabilirsiniz. –

1

bu deneyin:

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

Ben yüksek havai olabilir yakalamak istisna üzerinde TryParse (MSDN) yöntemini (kullanırsınız denilen eğer sık sık) geçersiz değerlerle:

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

Şahsen, Out parametresi bilişsel olarak daha ağır olan TryParse gibi hissediyorum ve verimliliğim için optimize ediyorum, böylece bir try/catch kullanıyorum ve istisnaları günlüğe kaydediyorum. Girişte yinelenen bir sorun varsa, nesne oluşturmadan önce ilk ayrıştırma işlemini eklerim. Bana göre, istisna işleme, kendimi erken optimizasyonda kendimi yitirmekle ilgili. –

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; 
    } 
} 
İlgili konular