72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
const pageWidth = 80
|
|
|
|
func main() {
|
|
printCal(1969)
|
|
}
|
|
|
|
func printCal(year int) {
|
|
thisDate := time.Date(year, 1, 1, 1, 1, 1, 1, time.UTC)
|
|
var (
|
|
dayArr [12][7][6]int // month, weekday, week
|
|
month, lastMonth time.Month
|
|
weekInMonth, dayInMonth int
|
|
)
|
|
for thisDate.Year() == year {
|
|
if month = thisDate.Month(); month != lastMonth {
|
|
weekInMonth = 0
|
|
dayInMonth = 1
|
|
}
|
|
weekday := thisDate.Weekday()
|
|
if weekday == 0 && dayInMonth > 1 {
|
|
weekInMonth++
|
|
}
|
|
dayArr[int(month)-1][weekday][weekInMonth] = thisDate.Day()
|
|
lastMonth = month
|
|
dayInMonth++
|
|
thisDate = thisDate.Add(time.Hour * 24)
|
|
}
|
|
centre := fmt.Sprintf("%d", pageWidth/2)
|
|
fmt.Printf("%"+centre+"s\n\n", "[SNOOPY]")
|
|
centre = fmt.Sprintf("%d", pageWidth/2-2)
|
|
fmt.Printf("%"+centre+"d\n\n", year)
|
|
months := [12]string{
|
|
" January ", " February", " March ", " April ",
|
|
" May ", " June ", " July ", " August ",
|
|
"September", " October ", " November", " December"}
|
|
days := [7]string{"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"}
|
|
for qtr := 0; qtr < 4; qtr++ {
|
|
for monthInQtr := 0; monthInQtr < 3; monthInQtr++ { // Month names
|
|
fmt.Printf(" %s ", months[qtr*3+monthInQtr])
|
|
}
|
|
fmt.Println()
|
|
for monthInQtr := 0; monthInQtr < 3; monthInQtr++ { // Day names
|
|
for day := 0; day < 7; day++ {
|
|
fmt.Printf(" %s", days[day])
|
|
}
|
|
fmt.Printf(" ")
|
|
}
|
|
fmt.Println()
|
|
for weekInMonth = 0; weekInMonth < 6; weekInMonth++ {
|
|
for monthInQtr := 0; monthInQtr < 3; monthInQtr++ {
|
|
for day := 0; day < 7; day++ {
|
|
if dayArr[qtr*3+monthInQtr][day][weekInMonth] == 0 {
|
|
fmt.Printf(" ")
|
|
} else {
|
|
fmt.Printf("%3d", dayArr[qtr*3+monthInQtr][day][weekInMonth])
|
|
}
|
|
}
|
|
fmt.Printf(" ")
|
|
}
|
|
fmt.Println()
|
|
}
|
|
fmt.Println()
|
|
}
|
|
}
|