2014-12-27 23 views
6

Vì vậy, tôi đang cố gắng tìm hiểu xem có cách nào khác để kiểm tra xem ngày có hợp lệ không. Vì vậy, ý tưởng là nếu ngày hợp lệ thì nó tiếp tục sử dụng ngày đã cho, nếu ngày không hợp lệ là sử dụng ngày hôm nay.Kiểm tra ngày hợp lệ

Đây là những gì tôi nhận được vào lúc này:

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

Vậy là có bất kỳ/cách dễ đọc hơn ngắn hơn để làm điều này?

Cảm ơn trước

+0

Hãy xem phương thức 'TryParseExact'. –

+0

DateTime.TryParse –

+0

sử dụng 'try {Birthdate = new DateTime (năm, tháng, ngày); } catch {Birthdate = DateTime.Today;} ' – Avijit

Trả lời

5

Bạn thể sử dụng các giá trị để cố gắng xây dựng một giá trị DateTime, sau đó bắt ArgumentOutOfRangeException xảy ra nếu đối số là ra khỏi phạm vi:

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

Một số có thể không đồng ý với việc sử dụng các ngoại lệ như thế này, nhưng tôi chỉ l làm cho lớp DateTime thực hiện các kiểm tra riêng của mình, thay vì tự tạo lại chúng.

Từ documentation, một ArgumentOutOfRangeException xảy ra nếu:

  • Năm là ít hơn 1 hoặc lớn hơn 9999, hoặc
  • Tháng là ít hơn 1 hoặc lớn hơn 12, hoặc
  • ngày là ít hơn 1 hoặc lớn hơn số ngày trong tháng.

Ngoài ra, bạn có thể sao chép logic từ lớp 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

Tôi đồng ý. Xử lý ngoại lệ có phí nhưng bạn nên luôn sử dụng khung công tác đã chọn của mình. Khả năng nó xử lý các trường hợp cạnh mà bạn không xem là cao. Bạn luôn có thể thực hiện chế biến tiếp theo trong phần đánh bắt để uốn cong các giá trị về trường hợp sử dụng của bạn. –

1

Hãy thử điều này:

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

tôi sẽ sử dụng phương pháp TryParse (MSDN) so với ngoại lệ đánh bắt (có thể chi phí cao nếu gọi thường xuyên có giá trị không hợp lệ):

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

Cá nhân, tôi cảm thấy như TryParse với tham số của nó là nhận thức nặng hơn và tôi tối ưu hóa cho năng suất của tôi vì vậy tôi sử dụng một try/catch và đăng nhập các ngoại lệ. Nếu có vấn đề lặp lại với đầu vào, tôi thêm phân tích cú pháp ban đầu trước khi xây dựng đối tượng. Đối với tôi, xử lý ngoại lệ là giữ cho bản thân không bị sa lầy khi tối ưu hóa sớm. –

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; 
    } 
} 
Các vấn đề liên quan