How to print the calendar for a specific year in Swift

1 Answer

0 votes
import Foundation

func printYear(_ year: Int) {
    for month in 1...12 {
        printMonth(year, month)
        print()
    }
}

func printMonth(_ year: Int, _ month: Int) {
    let calendar = Calendar(identifier: .gregorian)
    let firstDay = calendar.date(from: DateComponents(year: year, month: month, day: 1))!

    let formatter = DateFormatter()
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.dateFormat = "LLLL"   // full month name
    let monthName = formatter.string(from: firstDay)

    print()
    let header = "\(monthName) \(year)"
    print(header.padding(toLength: 20, withPad: " ", startingAt: 0))
    print("Su Mo Tu We Th Fr Sa")

    let weekday = calendar.component(.weekday, from: firstDay) // Sunday = 1
    let indent = weekday - 1

    for _ in 0..<indent {
        print("   ", terminator: "")
    }

    let range = calendar.range(of: .day, in: .month, for: firstDay)!
    for day in range {
        print(String(format: "%2d ", day), terminator: "")
        if (indent + day) % 7 == 0 {
            print()
        }
    }

    print()
}

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
...