/
hanakin.go
92 lines (75 loc) · 1.6 KB
/
hanakin.go
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package main
import (
"flag"
"fmt"
"log"
"time"
)
var y, m, p int
func init() {
flag.IntVar(&y, "year", 2014, "The year you want to know about")
flag.IntVar(&m, "month", 9, "The month you want to know about")
flag.IntVar(&p, "payday", 10, "The payday of your company")
}
func main() {
flag.Parse()
now := time.Now()
if y == 0 {
y = now.Year()
}
if m != 0 {
if m < 1 || m > 12 {
log.Fatalf("month must be between 1 and 12: %s", m)
}
} else {
m = int(now.Month())
}
calendar := NewCalendar(time.Month(m), y, p)
fmt.Println(calendar.String())
}
type Calendar struct {
year int
month *month
}
func NewCalendar(m time.Month, y, p int) (c *Calendar) {
c = &Calendar{year: y, month: NewMonth(m, y, p)}
return
}
func (c *Calendar) String() (s string) {
s = fmt.Sprintf("%d %s\n", c.year, c.month.number.String())
s += "====================\n"
s += c.month.String()
return
}
type month struct {
year int
number time.Month
days []time.Time
payday int
}
func NewMonth(n time.Month, y, p int) (m *month) {
m = &month{year: y, number: n, payday: p}
t := time.Date(y, n, 1, 0, 0, 0, 0, time.Local)
for {
m.days = append(m.days, t)
t = time.Date(y, n, t.Day()+1, 0, 0, 0, 0, time.Local)
if t.Month().String() != n.String() {
break
}
}
return
}
func (m *month) String() (s string) {
for _, d := range m.days {
if d.Weekday().String() == "Friday" && d.Day() == m.payday {
s += "FizzBuzz\n"
} else if d.Weekday().String() == "Friday" {
s += "Fizz\n"
} else if d.Day() == m.payday {
s += "Buzz\n"
} else {
s += fmt.Sprintf("%d\n", d.Day())
}
}
return
}