How to print the calendar for a specific year in PHP

1 Answer

0 votes
function printYear(int $year): void {
    for ($month = 1; $month <= 12; $month++) {
        printMonth($year, $month);
        echo "\n";
    }
}

function printMonth(int $year, int $month): void {
    $firstDay = new DateTime("$year-$month-01");
    $monthName = $firstDay->format("F");

    echo "\n";
    echo str_pad("$monthName $year", 20, " ", STR_PAD_LEFT) . "\n";
    echo "Su Mo Tu We Th Fr Sa\n";

    // Sunday = 0, Monday = 1, ...
    $indent = (int)$firstDay->format("w");

    echo str_repeat("   ", $indent);

    $daysInMonth = (int)$firstDay->format("t");

    for ($day = 1; $day <= $daysInMonth; $day++) {
        echo str_pad($day, 2, " ", STR_PAD_LEFT) . " ";

        if ((($indent + $day) % 7) === 0) {
            echo "\n";
        }
    }

    echo "\n";
}

printYear(2026);



/*
run:

        January 2026
Su Mo Tu We Th Fr Sa
             1  2  3 
 4  5  6  7  8  9 10 
11 12 13 14 15 16 17 
18 19 20 21 22 23 24 
25 26 27 28 29 30 31 



       February 2026
Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7 
 8  9 10 11 12 13 14 
15 16 17 18 19 20 21 
22 23 24 25 26 27 28 



          March 2026
Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7 
 8  9 10 11 12 13 14 
15 16 17 18 19 20 21 
22 23 24 25 26 27 28 
29 30 31 


          April 2026
Su Mo Tu We Th Fr Sa
          1  2  3  4 
 5  6  7  8  9 10 11 
12 13 14 15 16 17 18 
19 20 21 22 23 24 25 
26 27 28 29 30 


            May 2026
Su Mo Tu We Th Fr Sa
                1  2 
 3  4  5  6  7  8  9 
10 11 12 13 14 15 16 
17 18 19 20 21 22 23 
24 25 26 27 28 29 30 
31 


           June 2026
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6 
 7  8  9 10 11 12 13 
14 15 16 17 18 19 20 
21 22 23 24 25 26 27 
28 29 30 


           July 2026
Su Mo Tu We Th Fr Sa
          1  2  3  4 
 5  6  7  8  9 10 11 
12 13 14 15 16 17 18 
19 20 21 22 23 24 25 
26 27 28 29 30 31 


         August 2026
Su Mo Tu We Th Fr Sa
                   1 
 2  3  4  5  6  7  8 
 9 10 11 12 13 14 15 
16 17 18 19 20 21 22 
23 24 25 26 27 28 29 
30 31 


      September 2026
Su Mo Tu We Th Fr Sa
       1  2  3  4  5 
 6  7  8  9 10 11 12 
13 14 15 16 17 18 19 
20 21 22 23 24 25 26 
27 28 29 30 


        October 2026
Su Mo Tu We Th Fr Sa
             1  2  3 
 4  5  6  7  8  9 10 
11 12 13 14 15 16 17 
18 19 20 21 22 23 24 
25 26 27 28 29 30 31 



       November 2026
Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7 
 8  9 10 11 12 13 14 
15 16 17 18 19 20 21 
22 23 24 25 26 27 28 
29 30 


       December 2026
Su Mo Tu We Th Fr Sa
       1  2  3  4  5 
 6  7  8  9 10 11 12 
13 14 15 16 17 18 19 
20 21 22 23 24 25 26 
27 28 29 30 31 

*/

 



answered Jan 17 by avibootz
...