Как да представя диапазон от време за месеци, които нямат 31 дни в c#?

Искам да намеря отпуските, взети от служител след месец. Кодът работи перфектно за всички дати. Сега, ако искам да намеря отпуските, взети от служителя през януари, диапазонът е:

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

Използвайте DateTime.DaysInMonth(int year, int month)

        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