Skip to content

Commit b6f1ba8

Browse files
committed
Validator
1 parent 0ae01a0 commit b6f1ba8

File tree

3 files changed

+81
-56
lines changed

3 files changed

+81
-56
lines changed

readme.md

+6-5
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,17 @@ in := xtime.InRange(target, xtime.Range{
106106
用来满足一些业务场景中希望将长跨越日期改成短跨度日期后分段查询的需求.
107107

108108
```go
109-
days := 10
109+
var days uint = 10
110110
splitDateRanges := xtime.SplitDateRange(days, xtime.DateRange{
111111
Begin: xtime.NewDate(2000,1,1),
112112
End: xtime.NewDate(2000,2,8),
113113
})
114114
//splitDateRanges:
115115
//[
116-
// 2000-01-01~2000-01-11
117-
// 2000-01-12~2000-01-22
118-
// 2000-01-23~2000-02-02
119-
// 2000-02-03~2000-02-08
116+
// 2000-01-01~2000-01-10
117+
// 2000-01-11~2000-01-20
118+
// 2000-01-21~2000-01-30
119+
// 2000-01-31~2000-02-09
120+
// 2000-02-10~2000-02-11
120121
//]
121122
```

time.go

+15-11
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"database/sql/driver"
55
"fmt"
66
xerr "github.com/goclub/error"
7-
"log"
87
"math"
98
"strconv"
109
"time"
@@ -15,13 +14,18 @@ type Range struct {
1514
End time.Time
1615
}
1716

17+
func (r Range) Validator(err ...error) error {
18+
if r.Start.After(r.End) {
19+
return xerr.New("goclub/time: Range.Start can not be after Range.End")
20+
}
21+
return nil
22+
}
1823
func InRange(target time.Time, r Range) (in bool) {
1924
begin := r.Start
2025
end := r.End
21-
if r.Start.After(r.End) {
22-
begin = r.End
23-
end = r.Start
24-
log.Print("goclub/time: InRange(target time.Time, r Range) r.Start can not be after r.End, InRange() already replacement they")
26+
// 开始结束时间顺序错误,在后续逻辑可能造成验证错误
27+
if err := r.Validator(); err != nil {
28+
panic(err)
2529
}
2630
// begin <= target <= end -> true
2731
if (begin.Before(target) || begin.Equal(target)) &&
@@ -33,20 +37,20 @@ func InRange(target time.Time, r Range) (in bool) {
3337
}
3438

3539
type DateRange struct {
36-
Begin Date `note:"当日期是 2022-01-01 时等同于 Range{Start: 2022-01-01 00:00:00}"`
40+
Start Date `note:"当日期是 2022-01-01 时等同于 Range{Start: 2022-01-01 00:00:00}"`
3741
End Date `note:"当日期是 2022-01-03 时等同于 Range{End: 2022-01-03 23:59:59}"`
3842
}
3943

4044
func (r DateRange) Validator(err ...error) error {
41-
if r.Begin.After(r.End) {
42-
return xerr.New("goclub/time: DateRange.Begin can not be after DateRange.")
45+
if r.Start.After(r.End) {
46+
return xerr.New("goclub/time: DateRange.Start can not be after DateRange.End")
4347
}
4448
return nil
4549
}
4650

4751
func InRangeFromDate(target time.Time, r DateRange) (in bool) {
4852
timeRange := Range{
49-
Start: FirstSecondOfDate(r.Begin.Time(target.Location())),
53+
Start: FirstSecondOfDate(r.Start.Time(target.Location())),
5054
End: LastSecondOfDate(r.End.Time(target.Location())),
5155
}
5256
return InRange(target, timeRange)
@@ -273,7 +277,7 @@ func SplitRange(days uint, r DateRange) (splitRanges []DateRange) {
273277
}
274278
splitRanges = []DateRange{}
275279
// 边界: 2022-01-01~2022-01-01
276-
if r.Begin.Equal(r.End) {
280+
if r.Start.Equal(r.End) {
277281
splitRanges = append(splitRanges, r)
278282
return
279283
}
@@ -282,7 +286,7 @@ func SplitRange(days uint, r DateRange) (splitRanges []DateRange) {
282286
// 格式错误必须 panic 否则即使当前逻辑不出错后续逻辑也会出错
283287
panic(err)
284288
}
285-
slow := r.Begin
289+
slow := r.Start
286290
for {
287291
itemEnd := slow.AddDate(0, 0, int(days-1))
288292
if itemEnd.Before(r.End) {

time_test.go

+60-40
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,6 @@ func TestInRangeTime2(t *testing.T) {
4545
{[]time.Time{t2, t3, t4}, true},
4646
{[]time.Time{t2, t4, t4}, true},
4747
{[]time.Time{t2, t5, t4}, false},
48-
49-
// replacement begin & end
50-
{[]time.Time{t3, t2, t1}, true},
51-
{[]time.Time{t3, t5, t1}, false},
5248
}
5349
for _, item := range data {
5450
begin := item.Time[0]
@@ -61,6 +57,7 @@ func TestInRangeTime2(t *testing.T) {
6157
assert.Equalf(t, in, item.In, "Time: []time.Time{t%d, t%d, t%d}, %v, }", begin.Second(), target.Second(), end.Second(), item.In)
6258
}
6359
}
60+
6461
func TestInDateRangeTime(t *testing.T) {
6562
// 2000-01-01
6663
t1 := time.Date(2000, 1, 1, 0, 0, 0, 0, time.Local)
@@ -92,17 +89,13 @@ func TestInDateRangeTime(t *testing.T) {
9289
{[]time.Time{t2, t3, t4}, true},
9390
{[]time.Time{t2, t4, t4}, true},
9491
{[]time.Time{t2, t5, t4}, false},
95-
96-
// replacement begin & end
97-
{[]time.Time{t3, t2, t1}, true},
98-
{[]time.Time{t3, t5, t1}, false},
9992
}
10093
for _, item := range data {
10194
begin := item.Time[0]
10295
target := item.Time[1]
10396
end := item.Time[2]
10497
in := xtime.InRangeFromDate(target, xtime.DateRange{
105-
Begin: xtime.NewDateFromTime(begin),
98+
Start: xtime.NewDateFromTime(begin),
10699
End: xtime.NewDateFromTime(end),
107100
})
108101
assert.Equalf(t, in, item.In, "Date: []time.Time{t%d, t%d, t%d}, %v, }", begin.Second(), target.Second(), end.Second(), item.In)
@@ -160,14 +153,14 @@ func TestInRangeTime(t *testing.T) {
160153
In: true,
161154
},
162155
// 1 in 6 begin>end
163-
{
164-
InRangeTimeData: InRangeTimeData{
165-
Begin: time4,
166-
End: time2,
167-
Target: time3,
168-
},
169-
In: true,
170-
},
156+
//{
157+
// InRangeTimeData: InRangeTimeData{
158+
// Begin: time4,
159+
// End: time2,
160+
// Target: time3,
161+
// },
162+
// In: true,
163+
//},
171164
// 2 F in left 4 begin=end
172165
{
173166
InRangeTimeData: InRangeTimeData{
@@ -187,14 +180,14 @@ func TestInRangeTime(t *testing.T) {
187180
In: false,
188181
},
189182
// 2 F in left 6 begin>end
190-
{
191-
InRangeTimeData: InRangeTimeData{
192-
Begin: time4,
193-
End: time2,
194-
Target: time1,
195-
},
196-
In: false,
197-
},
183+
//{
184+
// InRangeTimeData: InRangeTimeData{
185+
// Begin: time4,
186+
// End: time2,
187+
// Target: time1,
188+
// },
189+
// In: false,
190+
//},
198191
// 3 F in right 4 begin=end
199192
{
200193
InRangeTimeData: InRangeTimeData{
@@ -214,14 +207,14 @@ func TestInRangeTime(t *testing.T) {
214207
In: false,
215208
},
216209
// 3 F in right 6 begin>end
217-
{
218-
InRangeTimeData: InRangeTimeData{
219-
Begin: time4,
220-
End: time2,
221-
Target: time5,
222-
},
223-
In: false,
224-
},
210+
//{
211+
// InRangeTimeData: InRangeTimeData{
212+
// Begin: time4,
213+
// End: time2,
214+
// Target: time5,
215+
// },
216+
// In: false,
217+
//},
225218
}
226219

227220
for k, v := range dataList {
@@ -703,7 +696,7 @@ func TestSplitRange(t *testing.T) {
703696
DateRangeToString := func(rs []xtime.DateRange) string {
704697
t := []string{}
705698
for _, r := range rs {
706-
t = append(t, r.Begin.String()+"~"+r.End.String())
699+
t = append(t, r.Start.String()+"~"+r.End.String())
707700
}
708701
return strings.Join(t, " ")
709702
}
@@ -715,37 +708,64 @@ func TestSplitRange(t *testing.T) {
715708
}
716709

717710
func TestDateRange_Validator(t *testing.T) {
718-
// Begin=End
711+
// Start=End
719712
{
720713
err := xtime.DateRange{}.Validator()
721714
assert.NoError(t, err)
722715
}
723-
// Begin>End error
716+
// Start>End error
724717
{
725718
err := xtime.DateRange{
726719
xtime.NewDate(2000, 1, 1), xtime.Date{},
727720
}.Validator()
728-
assert.Errorf(t, err, "goclub/time: DateRange.Begin can not be after DateRange.End")
721+
assert.Errorf(t, err, "goclub/time: DateRange.Start can not be after DateRange.End")
729722
}
730-
// Begin<End
723+
// Start<End
731724
{
732725
err := xtime.DateRange{
733726
xtime.Date{}, xtime.NewDate(2000, 1, 1),
734727
}.Validator()
735728
assert.NoError(t, err)
736729
}
737-
// Begin=End
730+
// Start=End
738731
{
739732
err := xtime.DateRange{
740733
xtime.NewDate(2000, 1, 1), xtime.NewDate(2000, 1, 1),
741734
}.Validator()
742735
assert.NoError(t, err)
743736
}
744-
// Begin<End
737+
// Start<End
745738
{
746739
err := xtime.DateRange{
747740
xtime.NewDate(2000, 1, 1), xtime.NewDate(2000, 1, 2),
748741
}.Validator()
749742
assert.NoError(t, err)
750743
}
751744
}
745+
746+
func TestRange_Validator(t *testing.T) {
747+
// start > end
748+
{
749+
err := xtime.Range{
750+
time.Date(2000, 1, 2, 0, 0, 1, 0, time.Local),
751+
time.Date(2000, 1, 1, 0, 0, 1, 0, time.Local),
752+
}.Validator()
753+
assert.Errorf(t, err, "goclub/time: Range.Start can not be after Range.End")
754+
}
755+
// start = end
756+
{
757+
err := xtime.Range{
758+
time.Date(2000, 1, 1, 0, 0, 1, 0, time.Local),
759+
time.Date(2000, 1, 1, 0, 0, 1, 0, time.Local),
760+
}.Validator()
761+
assert.NoError(t, err)
762+
}
763+
// start < end
764+
{
765+
err := xtime.Range{
766+
time.Date(2000, 1, 1, 0, 0, 1, 0, time.Local),
767+
time.Date(2000, 1, 2, 0, 0, 1, 0, time.Local),
768+
}.Validator()
769+
assert.NoError(t, err)
770+
}
771+
}

0 commit comments

Comments
 (0)