Ver Código Fonte

Support parsing "hours" like 1am or 10pm

Lucas Stadler 9 anos atrás
pai
commit
c52ea1af77
2 arquivos alterados com 53 adições e 2 exclusões
  1. 51 0
      go/remind/remind.go
  2. 2 2
      go/remind/remind_test.go

+ 51 - 0
go/remind/remind.go

90
90
91
	if len(parts) == more {
91
	if len(parts) == more {
92
		return t, nil
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
	return t, fmt.Errorf("unknown date spec '%s' (unexpected)", s)
112
	return t, fmt.Errorf("unknown date spec '%s' (unexpected)", s)
154
		return t.AddDate(n*years, n*months, n*days)
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
	}{
14
	}{
15
		{"today", now},
15
		{"today", now},
16
		{"tomorrow", now.AddDate(0, 0, 1)},
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
		{"in 3 days", now.AddDate(0, 0, 3)},
18
		{"in 3 days", now.AddDate(0, 0, 3)},
19
		{"in a month", now.AddDate(0, 1, 0)},
19
		{"in a month", now.AddDate(0, 1, 0)},
20
		{"in 3 months", now.AddDate(0, 3, 0)},
20
		{"in 3 months", now.AddDate(0, 3, 0)},
24
		{"in 3 weeks", now.AddDate(0, 0, 3*7)},
24
		{"in 3 weeks", now.AddDate(0, 0, 3*7)},
25
		//"2016-09-28",
25
		//"2016-09-28",
26
		//"3pm",
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
	for _, example := range examples {
30
	for _, example := range examples {