-
Notifications
You must be signed in to change notification settings - Fork 8
/
interval.go
95 lines (87 loc) · 1.9 KB
/
interval.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
package timeutil
import (
"fmt"
"strings"
"time"
)
const (
NanosecondString = "naonsecond"
MicrosecondString = "microsecond"
MillisecondString = "millisecond"
SecondString = "second"
MinuteString = "minute"
HourString = "hour"
DayString = "day"
WeekString = "week"
MonthString = "month"
QuarterString = "quarter"
HalfYearString = "halfyear"
YearString = "year"
DecadeString = "decade"
ScoreString = "score"
CenturyString = "century"
MillenniaString = "millennia"
)
type Interval int
const (
IntervalNanosecond Interval = iota
IntervalMicrosecond
IntervalMillisecond
IntervalSecond
IntervalMinute
IntervalHour
IntervalDay
IntervalWeek
IntervalMonth
IntervalQuarter
IntervalHalfYear
IntervalYear
IntervalDecade
IntervalScore
IntervalCentury
IntervalMillennia
)
var intervals = [...]string{
NanosecondString,
MicrosecondString,
MillisecondString,
SecondString,
MinuteString,
HourString,
DayString,
WeekString,
MonthString,
QuarterString,
HalfYearString,
YearString,
DecadeString,
ScoreString,
CenturyString,
MillenniaString,
}
func (i Interval) String() string { return intervals[i] }
func ParseInterval(src string) (Interval, error) {
canonical := strings.ToLower(strings.TrimSpace(src))
for i, try := range intervals {
if canonical == try {
return Interval(i), nil
}
}
return 0, fmt.Errorf("interval [%v] not found", src)
}
func intervalStart(dt time.Time, interval Interval, d time.Weekday) (time.Time, error) {
switch interval.String() {
case YearString:
return yearStart(dt), nil
case QuarterString:
return quarterStart(dt), nil
case MonthString:
return monthStart(dt), nil
case WeekString:
return weekStart(dt, d), nil
case DayString:
return dayStart(dt), nil
default:
return time.Time{}, fmt.Errorf("interval (%s) not supported in timeutil.IntervalStart", interval.String())
}
}