Чтобы получить с понедельника по субботу в текущем месяце

#c# #.net #arrays

#c# #.net #массивы

Вопрос:

Через месяц я хочу знать с понедельника по субботу за текущий месяц, например: в октябре 2011 года

 3-oct-2011 to 8-oct-2011,
10-OCt-11 to 15-Oct-11, 
17-Oct-11 to 22-oct-2011,
24-Oct-2011 to 29-Oct-2011 
 

все эти последовательности дней, все эти дни, такие как 3-oct-2011,4-oct-2011 ….29-oct-11 и т.д., должны быть представлены в формате массива или в таблице данных.

Ответ №1:

 var today = DateTime.Today;
var daysInMonth = DateTime.DaysInMonth(today.Year, today.Month);

var dates = Enumerable.Range(1, daysInMonth)
                            .Select(n => new DateTime(today.Year, today.Month, n))
                            .Where(date => date.DayOfWeek != DayOfWeek.Sunday)
                            .ToArray();
 

Это позволит просмотреть количество дней в текущем месяце, создать объект DateTime для каждого, а затем возвращать только те даты, которые не являются воскресеньем, в виде массива.

 var today = DateTime.Today;
var daysInMonth = DateTime.DaysInMonth(today.Year, today.Month);

var dates = Enumerable.Range(1, daysInMonth)
                            .Select(n => new DateTime(today.Year, today.Month, n))
                            .Where(date => date.DayOfWeek != DayOfWeek.Sunday)
                            .SkipWhile(date => date.DayOfWeek != DayOfWeek.Monday)
                            .TakeWhile(date => date.DayOfWeek != DayOfWeek.Monday || (date.DayOfWeek == DayOfWeek.Monday amp;amp; daysInMonth - date.Day > 7))
                            .ToArray();
 

Это сделает то же самое, за исключением удаления любых диапазонов Понедельник -> Суббота, которых нет в текущем месяце. (Неделя началась в предыдущем месяце или заканчивается в следующем).

Редактировать:

Вот решение .NET 2, которое будет делать то же самое, что и мое ранее опубликованное решение LINQ.

         DateTime today = DateTime.Today;
        int daysInMonth = DateTime.DaysInMonth(today.Year, today.Month);

        List<DateTime> dates = new List<DateTime>();

        bool foundFirst = false;

        for (int n = 1; n <= daysInMonth; n  )
        {
            var date = new DateTime(today.Year, today.Month, n);

            // Skip untill we find the first Monday of the month.
            if (date.DayOfWeek != DayOfWeek.Monday amp;amp; !foundFirst)
                continue;

            foundFirst = true;

            // Add all days except Sundays. 
            if (date.DayOfWeek != DayOfWeek.Sunday)
                dates.Add(date);

            int remainingDays = daysInMonth - n;

            // Verify that there are enough days left in this month to add all days upto the next Saturday.
            if (date.DayOfWeek == DayOfWeek.Saturday amp;amp; remainingDays < 7)
                break;
        }

        DateTime[] dateArray = dates.ToArray();
 

Комментарии:

1. @Nathan Я обновил свой ответ, чтобы также включить решение .NET 2.0.

Ответ №2:

самый простой:

         int month = DateTime.Now.Month;
        int year = DateTime.Now.Year;
        int days= DateTime.DaysInMonth(year, month);
        int totalSaturdays = 0;
        for(int i=1;i<=days;i  )
        {
            var day = new DateTime(year, month, i);
            if(day.DayOfWeek==DayOfWeek.Saturday)
            {
                totalSaturdays  ;
            }
        }
        Console.WriteLine(("Total Saturdays =" totalSaturdays.ToString()));
        Console.ReadLine();
 

Комментарии:

1. Пожалуйста, отформатируйте свой ответ. Это нелегко прочитать в текущем состоянии

Ответ №3:

Эффективное решение;

 var x = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
int i = 1;
while (i <= x)
{
    if (new DateTime(DateTime.Now.Year, DateTime.Now.Month, i).DayOfWeek == DayOfWeek.Saturday)
    {
        Console.WriteLine(new DateTime(DateTime.Now.Year, DateTime.Now.Month, i));
        i  = 6;
    }
    i  ;
}