Как представить диапазон дат для месяцев, в которых нет 31 дня в С#?

Я хочу найти отпуска, взятые сотрудником за месяц. Код отлично работает для всех дат. Теперь, если я хочу найти отпуск, взятый сотрудником в январе, диапазон будет следующим:

DateTime first = Convert.ToDateTime(DateTime.Now.Month + "01" + DateTime.Now.Year);
DateTime end = Convert.ToDateTime(DateTime.Now.Month + "31" + DateTime.Now.Year);

Проблема в том, что в некоторых месяцах нет 31 дня. Есть ли простой способ, с помощью которого я мог бы назначить переменные From и To в диапазоне. Ошибка будет дана, когда месяцы февраль или апрель, потому что у них нет 31 дня.

Код для выполнения поиска:

returnedRows = LeaveDS.Tables["Leave"].Select("LeaveDate >= #" + first + "# AND LeaveDate <= #" + end + "#");

person Waqas Ali    schedule 25.01.2013    source источник


Ответы (6)


Вы можете сделать что-то вроде этого:

DateTime end = first.AddMonths(1).AddDays(-1);
person itsme86    schedule 25.01.2013

DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month)

это даст вам дни в месяце.

person AD.Net    schedule 25.01.2013

Используйте 1_

        int days = DateTime.DaysInMonth(2012, 2);
        int days2 = DateTime.DaysInMonth(2011, 2);

выход:

 days = 29
 days2 = 28
person CJ_912    schedule 25.01.2013

Вы можете получить количество дней в месяце с помощью DateTime.DaysInMonth(year,month) и использовать это как основу для своего запроса.

В качестве альтернативы можно использовать первое число каждого месяца, но изменить запрос выбора так, чтобы он был меньше конечной даты.

DateTime first = Convert.ToDateTime(DateTime.Now.Month + "01" + DateTime.Now.Year);
DateTime end = first.AddMonths(1); // Becomes 01 of next month

returnedRows = LeaveDS.Tables["Leave"].Select("LeaveDate >= #" + first + "# AND LeaveDate < #" + end + "#");
person Kami    schedule 25.01.2013

Существует отличный способ получить количество дней в месяце, он называется DateTime.DaysInMonth

DateTime end = new DateTime(first.Year, first.Month, DateTime.DaysInMonth(first.Year, first.Month);
person Karl-Johan Sjögren    schedule 25.01.2013

Кстати, если вы используете .NET 3.5 или более позднюю версию, Linq-To-DataSet упростит и улучшит код:

int month = 2; // f.e. for february
var currentCalendar = System.Globalization.CultureInfo.CurrentCulture.Calendar;
int daysInMonth = currentCalendar.GetDaysInMonth(month);
DateTime start = new DateTime(DateTime.Now.Year, month, 1);
DateTime end = new DateTime(DateTime.Now.Year, month, daysInMonth);
var filteredRows = LeaveDS.Tables["Leave"].AsEnumerable()
    .Where(r => r.Field<DateTime>("LeaveDate").Date >= start
             && r.Field<DateTime>("LeaveDate").Date <= end );
// use ToArray for an array, CopyToDataTable for a DataTable etc.
person Tim Schmelter    schedule 25.01.2013
comment
Этот код выглядит очень интересно, но я не очень хорошо разбираюсь в LINQ, поэтому не буду его использовать. В любом случае спасибо - person Waqas Ali; 25.01.2013