2010-03-09 46 views
27

Thông thường tôi sử dụng mã bên dưới, nhưng có cách nào tốt hơn không?Ngày cuối cùng của tháng trong .NET

lastOfMonth = new DateTime(Now.Year, Now.Month, 1).AddMonths(1).AddDays(-1) 
+3

Xác định "tốt hơn". –

+0

Tôi nghĩ rằng chỉ có một chức năng được cung cấp bởi API sẽ làm một công việc tốt hơn. –

+1

Bạn có muốn một thời gian cụ thể không? Nếu không, bạn nên sử dụng Hôm nay, không phải bây giờ. –

Trả lời

49

tôi sử dụng

DateTime now = DateTime.Today; 
var lastDate = new DateTime(now.Year, now.Month, DateTime.DaysInMonth(now.Year, now.Month)); 
8
DateTime(year, month, DateTime.DaysInMonth(year, month)). 
3

Bạn có thể sử dụng CultureInfo.CurrentCulture.Calendar.GetDaysInMonth (Now.Year, Now.Month)

12

tôi có lẽ sẽ sử dụng DaysInMonth vì nó làm cho mã một chút dễ đọc hơn và dễ hiểu hơn (mặc dù, tôi thực sự thích lừa của bạn :-)). Đây requieres một số tiền tương tự gõ (đó là khá nhiều), vì vậy tôi có lẽ sẽ xác định một phương pháp khuyến nông:

DateTime LastDayOfMonth(this DateTime) { 
    var days = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month); 
    return new DateTime(DateTime.Now.Year, DateTime.Now.Month, days); 
} 

Bây giờ chúng ta có thể sử dụng DateTime.Now.LastDayOfMonth() trông :-) tốt hơn rất nhiều.

2

Đây là cách bạn có thể nhận được số ngày trong tháng bằng cách sử dụng Noda Time:

int days = CalendarSystem.Iso.GetDaysInMonth(year, month); 

Khá đơn giản, eh? Vâng, giả định bạn biết năm và tháng bạn đang hỏi về. Nếu bạn muốn nó cho hiện tháng, và trong khu thời gian hệ thống, sau đó bạn phải xác định rằng một cách rõ ràng, như thế này:

DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault(); 
LocalDate localDate = SystemClock.Instance.Now.InZone(tz).Date; 
int days = localDate.Calendar.GetDaysInMonth(localDate.Year, localDate.Month); 

Noda Time cố ý làm cho bạn suy nghĩ về những điều này, thay vì chỉ cần đưa ra các giả định rằng DateTime.Now hoặc DateTime.Today làm.

Các vấn đề liên quan