Parcourir la Source

Support parsing "hours" like 1am or 10pm

Lucas Stadler 9 ans auparavant
Parent
commit
c52ea1af77
2 fichiers modifiés avec 53 ajouts et 2 suppressions
  1. 51 0
      go/remind/remind.go
  2. 2 2
      go/remind/remind_test.go

+ 51 - 0
go/remind/remind.go

@ -90,6 +90,23 @@ func parseTimeRelative(s string, now time.Time) (time.Time, error) {
90 90
91 91
	if len(parts) == more {
92 92
		return t, nil
93
	} else if len(parts) == more+2 && parts[more] == "at" {
94
		h, err := parseHours(parts[more+1])
95
		if err != nil {
96
			return t, err
97
		}
98
99
		t = truncateHours(t)
100
		return t.Add(h), nil
101
	} else if len(parts) == more+3 && parts[more] == "at" &&
102
		(parts[more+2] == "am" || parts[more+2] == "pm") {
103
		h, err := parseHours(parts[more+1] + parts[more+2])
104
		if err != nil {
105
			return t, err
106
		}
107
108
		t = truncateHours(t)
109
		return t.Add(h), nil
93 110
	}
94 111
95 112
	return t, fmt.Errorf("unknown date spec '%s' (unexpected)", s)
@ -154,3 +171,37 @@ func dateModifier(years, months, days int) func(int, time.Time) time.Time {
154 171
		return t.AddDate(n*years, n*months, n*days)
155 172
	}
156 173
}
174
175
func parseHours(s string) (time.Duration, error) {
176
	var d time.Duration
177
178
	isPm := false
179
	switch {
180
	case strings.HasSuffix(s, "am"):
181
		s = s[0 : len(s)-2]
182
	case strings.HasSuffix(s, "pm"):
183
		isPm = true
184
		s = s[0 : len(s)-2]
185
	default:
186
		return d, fmt.Errorf("unknown hours '%s'", s)
187
	}
188
189
	n, err := strconv.Atoi(s)
190
	if err != nil {
191
		return d, err
192
	}
193
194
	if n < 1 || n > 12 {
195
		return d, fmt.Errorf("invalid hour: %d (must be between 1 and 12)", n)
196
	}
197
198
	if isPm {
199
		n += 12
200
	}
201
202
	return time.Duration(n) * time.Hour, nil
203
}
204
205
func truncateHours(t time.Time) time.Time {
206
	return t.Truncate(time.Hour).Add(-time.Duration(t.Hour()) * time.Hour)
207
}

+ 2 - 2
go/remind/remind_test.go

@ -14,7 +14,7 @@ func TestParse(t *testing.T) {
14 14
	}{
15 15
		{"today", now},
16 16
		{"tomorrow", now.AddDate(0, 0, 1)},
17
		//"tomorrow at 3am"
17
		{"tomorrow at 3am", truncateHours(now).AddDate(0, 0, 1).Add(3 * time.Hour)},
18 18
		{"in 3 days", now.AddDate(0, 0, 3)},
19 19
		{"in a month", now.AddDate(0, 1, 0)},
20 20
		{"in 3 months", now.AddDate(0, 3, 0)},
@ -24,7 +24,7 @@ func TestParse(t *testing.T) {
24 24
		{"in 3 weeks", now.AddDate(0, 0, 3*7)},
25 25
		//"2016-09-28",
26 26
		//"3pm",
27
		//"in 4 days at 10 pm",
27
		{"in 4 days at 10 pm", truncateHours(now).AddDate(0, 0, 4).Add(22 * time.Hour)},
28 28
	}
29 29
30 30
	for _, example := range examples {