Q:

Вывод текущего месяца, задваиваются цифры на php

Всем добрый вечер!
Нужно вывести месяц, выходные отметить красным, текущую дату обвести.
При выводе удваиваются цифры. Подскажите, в чем причина?
Заранее спасибо.
<style> 
.normal:hover {
    background-color: black; 
    color: white;
} 
.weekend:hover {
    background-color: red; 
    color: white;
}

</style>

<?php

echo "<table><tbody><tr>";
for ($i = 1; $i <= 31; $i++) {
    echo '<td class="normal" style="color:black" normal:hover">'.$i."</td>";
    
    if ($i == 7 || $i == 14 || $i == 21 || $i == 28) {
        echo '<td class="weekend" style="color:red">'.($i-1)."</td>";
        echo '<td class="weekend" style="color:red">'.$i."</td>";
        echo "</tr>";

    }
    
    if ($i == date(j)) {
        echo '<td style="border:1px solid blue">'.$i."</td>";
    }
}
echo "</tbody></table>";

?>

A:

Как можно делать календарь и не использовать DateTime?
<style>
        .month {
            width: 350px;
            display: block;
        }
        .month .day {
            display: inline-block;
            width: 50px;
            border: #0000ff 1px solid;
            padding: 5px;
            color: #1a4580;
        }
        .month .day.today {
            color: white !important;
            background-color: green !important;
            font-weight: bold;
        }
        .month .day.invis {
            border: none;

        }
        .month .day.weekend {
            color: red;
            border: red 1px solid;
        }
    </style>

    <div class="month">
<?php
    $dt = new \DateTimeImmutable();
    $day = \DateTimeImmutable::createFromFormat('d.m.Y', '01.' . $dt->format('m.Y'));
    $dayOfWeek = 1;
    while ($dayOfWeek < $day->format('N')) {
        ?><div class="day invis <?=($day->format('N') > 5 ? 'weekend' : '');?>"></div><?
        $dayOfWeek++;
    }

    while ($day->format('m') == $dt->format('m')) {
        ?><div class="day <?=($day->format('N') > 5 ? 'weekend' : '');?><?=($day->format('d') == $dt->format('d') ? ' today' : '');?>"><?=$day->format('d');?></div><?
        $day = $day->add(new DateInterval('P1D'));
    }
    ?>
</div>

