Получить список дат первой недели текущего месяца в C# - PullRequest
0 голосов
/ 06 мая 2020

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

 public static List<DateTime> GetDates(int year, int month)
{
   return Enumerable.Range(1, DateTime.DaysInMonth(year, month))  
                    .Select(day => new DateTime(year, month, day)) 
                    .ToList(); 
}

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

Я хочу достичь следующего:

Day: SUN, MON, TUE, WED, THU, FRI, SAT
Date 1, 2, 3, 5, 6.. 

Как я могу достичь этого в C#?

Используя это:

DateTime today = DateTime.Today;
            int currentDayOfWeek = (int) today.DayOfWeek;
            DateTime sunday = today.AddDays(-currentDayOfWeek);
            DateTime monday = sunday.AddDays(1);
            // If we started on Sunday, we should actually have gone *back*
            // 6 days instead of forward 1...
            if (currentDayOfWeek == 0)
            {
                monday = monday.AddDays(-7);
            }
            var dates = Enumerable.Range(0, 6).Select(days => monday.AddDays(days)).ToList();


            foreach (var date in dates) {
            Console.WriteLine(date);
            }

Мне удалось получить за текущую неделю. Но как я могу получить и день?

Результат:

04.05.2020 00:00:00
05.05.2020 00:00:00
06.05.2020 00:00:00
07.05.2020 00:00:00
08.05.2020 00:00:00
09.05.2020 00:00:00

Я хочу, чтобы мои выходные данные были:

ПН - 04.05.2020 ВТ - 05.05.2019. 2020

1 Ответ

6 голосов
/ 06 мая 2020

Вы можете использовать Enumerable.Take, чтобы получить первую неделю (которая соответствует первым 7 элементам) возвращенного списка.

Enumerable.Range(1, DateTime.DaysInMonth(2020, 5))
                    .Select(day => new DateTime(2020, 5, day))
                    .Take(7)
                    .ToList();

Поскольку вы заявили, что первая неделя фактически должна начаться в понедельник, вы можете изменить запрос, используя Enumerable.SkipWhile, чтобы пропустить дни, пока не найдете первую правильную дату.

Enumerable.Range(1, DateTime.DaysInMonth(2020, 5))
                    .Select(day => new DateTime(2020, 5, day))
                    .SkipWhile(z => z.DayOfWeek != DayOfWeek.Monday)
                    .Take(7)
                    .ToList();

Что касается вашего комментария :

Используя ddd форматтер , вы можете получить короткие названия дней. string shortName = DateTime.Now.ToString("ddd");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...