-
Notifications
You must be signed in to change notification settings - Fork 0
/
mfdate.go
107 lines (79 loc) · 1.93 KB
/
mfdate.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package date
import (
"time"
)
const mfDateStringLayout = "Jan 2, 2006"
// Martin Fowler's time point implementation https://martinfowler.com/eaaDev/TimePoint.html.
type MfDate struct {
base *time.Time
}
func NewMfDate() MfDate {
t := time.Now()
return MfDate{
base: &t,
}
}
func NewMfDateFromTime(t time.Time) MfDate {
d := MfDate{}
d.initialize(t)
return d
}
func NewMfDateFromDate(year int, month int, day int) MfDate {
return NewMfDateFromTime(time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC))
}
func (d *MfDate) initialize(t time.Time) {
d.base = trimToDays(t)
}
func trimToDays(t time.Time) *time.Time {
res := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.UTC().Location())
return &res
}
func (d MfDate) IsZero() bool {
return d.base == nil || d.base.IsZero()
}
func (d MfDate) Year() int {
return d.base.Year()
}
func (d MfDate) Month() int {
return int(d.base.Month())
}
func (d MfDate) Day() int {
return d.base.Day()
}
func (d MfDate) Time() time.Time {
return *d.base
}
func (d MfDate) After(arg MfDate) bool {
return d.base.After(arg.Time())
}
func (d MfDate) Before(arg MfDate) bool {
return d.base.Before(arg.Time())
}
func (d MfDate) Equals(arg MfDate) bool {
return d.base.Equal(arg.Time())
}
func (d MfDate) AddMonthResetDay(mm int) MfDate {
t := time.Date(d.Year(), time.Month(d.Month()+mm), 1, 0, 0, 0, 0, time.UTC)
return NewMfDateFromTime(t)
}
func (d MfDate) YearMonthEqual(arg MfDate) bool {
return d.Year() == arg.Year() && d.Month() == arg.Month()
}
func (d MfDate) DayBeforeOrEquals(arg MfDate) bool {
if d.YearMonthEqual(arg) {
return true
}
return d.DayBefore(arg)
}
func (d MfDate) DayBefore(arg MfDate) bool {
if d.Year() < arg.Year() {
return true
}
return d.Year() == arg.Year() && d.Month() < arg.Month()
}
func (d MfDate) String() string {
return d.base.Format(mfDateStringLayout)
}
func (d MfDate) Format(l string) string {
return d.base.Format(l)
}