Составление календарных месяцев, начинающихся в воскресенье, урезает первую неделю

#c# #asp.net-core #razor

Вопрос:

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

         August 2021
MON TUE WED THU FRI SAT SUN
 02  03  04  05  06  07  08
 09  10  11  12  13  14  15
 16  17  18  19  20  21  22
 23  24  25  26  27  28  29
 30  31
 

До сих пор это мой код:

 DateTime displayMonth = new DateTime(2021, 8, 1); // This will be dynamic, ofc.
int firstDay = (int)displayMonth.DayOfWeek;
int cellCounter = 0;
int daysInMonth = (int)DateTime.DaysInMonth(displayMonth.Year, displayMonth.Month);
int weeksInMonth = (int)Math.Ceiling((double)(firstDay   daysInMonth) / 7);
for (var w = 0; w <= weeksInMonth; w  )
{
    <div class="row">
        @for (var d = 0; d < 7; d  )
        {
            cellCounter  ;
            <div class="col">
                @{
                    int day = 1   cellCounter - firstDay;
                    if (day > 0 amp;amp; day <= daysInMonth)
                    {
                        <h1>@day</h1>
                    }
                }
            </div>
        }
    </div>
}
 

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

1. Обратите внимание, displayMonth.DayOfWeek что в воскресенье будет 0 (потому что это то, что США используют для начала своей недели), но вы действительно хотите, чтобы это был день номер 7 (или более точно смещенный 6).

2. Переместите счетчик ячеек ; ниже div «coll» по мере увеличения за день до его фактического использования, и, как упоминал @gunr2171, воскресенье начинается с 0 дня недели.

Ответ №1:

Я уже знал, что значения индекса DayOfWeek и в воскресенье равны 0. Чего у меня не было, так это «преобразования», чтобы сместить понедельник на 0:

 int firstDay = ((int)displayMonth.DayOfWeek   6) % 7;
 

Это рабочий код:

 DateTime displayMonth = new DateTime(2021, 9, 1); 
int firstDay = ((int)displayMonth.DayOfWeek   6) % 7;
int cellCounter = 0;
int daysInMonth = (int)DateTime.DaysInMonth(displayMonth.Year, displayMonth.Month);
int weeksInMonth = (int)Math.Ceiling((double)(firstDay   daysInMonth) / 7);
for (var w = 0; w <= weeksInMonth; w  )
{
    <div class="row">
        @for (var d = 0; d < 7; d  )
        {
            cellCounter  ;
            <div class="col">
                @{
                    int day = cellCounter - firstDay;
                    if (day > 0 amp;amp; day <= daysInMonth)
                    {
                        <h1>@day</h1>
                    }
                }
            </div>
        }
    </div>
}