2010-03-09 3 views
27

Обычно я использую приведенный ниже код, но есть ли лучший способ?Последний день месяца в .NET

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

Определите «лучше». –

+0

Я думаю, что только функция, предоставляемая API, будет лучше работать. –

+1

Вы хотите определенное время? Если нет, вы должны использовать «Сегодня», а не «сейчас». –

ответ

49

Я использую

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

Вы можете использовать CultureInfo.CurrentCulture.Calendar.GetDaysInMonth (Now.Year, Now.Month)

12

я бы, вероятно, использовать DaysInMonth, как это делает код немного читабельнее и понятнее (хотя мне очень нравится трюк :-)). Это requieres аналогичной суммы нажатий клавиша (что довольно много), так что я бы, вероятно, определить метод расширения:

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

Теперь мы можем использовать DateTime.Now.LastDayOfMonth(), который выглядит намного лучше :-).

2

Вот как вы можете получить количество дней в месяце с помощью Noda Time:

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

Довольно просто, да? Хорошо, что предполагает, что вы знаете год и месяц, о которых вы спрашиваете. Если вы хотите для текущего месяца, а в часовом поясе системы , то вы должны указать, что в явном виде, например:

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

Нода Время намеренно заставляет вас думать об этих вещах, а не просто сделав предположения, что DateTime.Now или DateTime.Today сделать.

Смежные вопросы