RosettaCodeData/Task/Calendar/Go/calendar.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()
}
}