Skip to content

Commit

Permalink
Validator
Browse files Browse the repository at this point in the history
  • Loading branch information
nimoc committed Jul 31, 2024
1 parent 0ae01a0 commit b6f1ba8
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 56 deletions.
11 changes: 6 additions & 5 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,16 +106,17 @@ in := xtime.InRange(target, xtime.Range{
用来满足一些业务场景中希望将长跨越日期改成短跨度日期后分段查询的需求.

```go
days := 10
var days uint = 10
splitDateRanges := xtime.SplitDateRange(days, xtime.DateRange{
Begin: xtime.NewDate(2000,1,1),
End: xtime.NewDate(2000,2,8),
})
//splitDateRanges:
//[
// 2000-01-01~2000-01-11
// 2000-01-12~2000-01-22
// 2000-01-23~2000-02-02
// 2000-02-03~2000-02-08
// 2000-01-01~2000-01-10
// 2000-01-11~2000-01-20
// 2000-01-21~2000-01-30
// 2000-01-31~2000-02-09
// 2000-02-10~2000-02-11
//]
```
26 changes: 15 additions & 11 deletions time.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"database/sql/driver"
"fmt"
xerr "github.com/goclub/error"
"log"
"math"
"strconv"
"time"
Expand All @@ -15,13 +14,18 @@ type Range struct {
End time.Time
}

func (r Range) Validator(err ...error) error {
if r.Start.After(r.End) {
return xerr.New("goclub/time: Range.Start can not be after Range.End")
}
return nil
}
func InRange(target time.Time, r Range) (in bool) {
begin := r.Start
end := r.End
if r.Start.After(r.End) {
begin = r.End
end = r.Start
log.Print("goclub/time: InRange(target time.Time, r Range) r.Start can not be after r.End, InRange() already replacement they")
// 开始结束时间顺序错误,在后续逻辑可能造成验证错误
if err := r.Validator(); err != nil {
panic(err)
}
// begin <= target <= end -> true
if (begin.Before(target) || begin.Equal(target)) &&
Expand All @@ -33,20 +37,20 @@ func InRange(target time.Time, r Range) (in bool) {
}

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

func (r DateRange) Validator(err ...error) error {
if r.Begin.After(r.End) {
return xerr.New("goclub/time: DateRange.Begin can not be after DateRange.")
if r.Start.After(r.End) {
return xerr.New("goclub/time: DateRange.Start can not be after DateRange.End")
}
return nil
}

func InRangeFromDate(target time.Time, r DateRange) (in bool) {
timeRange := Range{
Start: FirstSecondOfDate(r.Begin.Time(target.Location())),
Start: FirstSecondOfDate(r.Start.Time(target.Location())),
End: LastSecondOfDate(r.End.Time(target.Location())),
}
return InRange(target, timeRange)
Expand Down Expand Up @@ -273,7 +277,7 @@ func SplitRange(days uint, r DateRange) (splitRanges []DateRange) {
}
splitRanges = []DateRange{}
// 边界: 2022-01-01~2022-01-01
if r.Begin.Equal(r.End) {
if r.Start.Equal(r.End) {
splitRanges = append(splitRanges, r)
return
}
Expand All @@ -282,7 +286,7 @@ func SplitRange(days uint, r DateRange) (splitRanges []DateRange) {
// 格式错误必须 panic 否则即使当前逻辑不出错后续逻辑也会出错
panic(err)
}
slow := r.Begin
slow := r.Start
for {
itemEnd := slow.AddDate(0, 0, int(days-1))
if itemEnd.Before(r.End) {
Expand Down
100 changes: 60 additions & 40 deletions time_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,6 @@ func TestInRangeTime2(t *testing.T) {
{[]time.Time{t2, t3, t4}, true},
{[]time.Time{t2, t4, t4}, true},
{[]time.Time{t2, t5, t4}, false},

// replacement begin & end
{[]time.Time{t3, t2, t1}, true},
{[]time.Time{t3, t5, t1}, false},
}
for _, item := range data {
begin := item.Time[0]
Expand All @@ -61,6 +57,7 @@ func TestInRangeTime2(t *testing.T) {
assert.Equalf(t, in, item.In, "Time: []time.Time{t%d, t%d, t%d}, %v, }", begin.Second(), target.Second(), end.Second(), item.In)
}
}

func TestInDateRangeTime(t *testing.T) {
// 2000-01-01
t1 := time.Date(2000, 1, 1, 0, 0, 0, 0, time.Local)
Expand Down Expand Up @@ -92,17 +89,13 @@ func TestInDateRangeTime(t *testing.T) {
{[]time.Time{t2, t3, t4}, true},
{[]time.Time{t2, t4, t4}, true},
{[]time.Time{t2, t5, t4}, false},

// replacement begin & end
{[]time.Time{t3, t2, t1}, true},
{[]time.Time{t3, t5, t1}, false},
}
for _, item := range data {
begin := item.Time[0]
target := item.Time[1]
end := item.Time[2]
in := xtime.InRangeFromDate(target, xtime.DateRange{
Begin: xtime.NewDateFromTime(begin),
Start: xtime.NewDateFromTime(begin),
End: xtime.NewDateFromTime(end),
})
assert.Equalf(t, in, item.In, "Date: []time.Time{t%d, t%d, t%d}, %v, }", begin.Second(), target.Second(), end.Second(), item.In)
Expand Down Expand Up @@ -160,14 +153,14 @@ func TestInRangeTime(t *testing.T) {
In: true,
},
// 1 in 6 begin>end
{
InRangeTimeData: InRangeTimeData{
Begin: time4,
End: time2,
Target: time3,
},
In: true,
},
//{
// InRangeTimeData: InRangeTimeData{
// Begin: time4,
// End: time2,
// Target: time3,
// },
// In: true,
//},
// 2 F in left 4 begin=end
{
InRangeTimeData: InRangeTimeData{
Expand All @@ -187,14 +180,14 @@ func TestInRangeTime(t *testing.T) {
In: false,
},
// 2 F in left 6 begin>end
{
InRangeTimeData: InRangeTimeData{
Begin: time4,
End: time2,
Target: time1,
},
In: false,
},
//{
// InRangeTimeData: InRangeTimeData{
// Begin: time4,
// End: time2,
// Target: time1,
// },
// In: false,
//},
// 3 F in right 4 begin=end
{
InRangeTimeData: InRangeTimeData{
Expand All @@ -214,14 +207,14 @@ func TestInRangeTime(t *testing.T) {
In: false,
},
// 3 F in right 6 begin>end
{
InRangeTimeData: InRangeTimeData{
Begin: time4,
End: time2,
Target: time5,
},
In: false,
},
//{
// InRangeTimeData: InRangeTimeData{
// Begin: time4,
// End: time2,
// Target: time5,
// },
// In: false,
//},
}

for k, v := range dataList {
Expand Down Expand Up @@ -703,7 +696,7 @@ func TestSplitRange(t *testing.T) {
DateRangeToString := func(rs []xtime.DateRange) string {
t := []string{}
for _, r := range rs {
t = append(t, r.Begin.String()+"~"+r.End.String())
t = append(t, r.Start.String()+"~"+r.End.String())
}
return strings.Join(t, " ")
}
Expand All @@ -715,37 +708,64 @@ func TestSplitRange(t *testing.T) {
}

func TestDateRange_Validator(t *testing.T) {
// Begin=End
// Start=End
{
err := xtime.DateRange{}.Validator()
assert.NoError(t, err)
}
// Begin>End error
// Start>End error
{
err := xtime.DateRange{
xtime.NewDate(2000, 1, 1), xtime.Date{},
}.Validator()
assert.Errorf(t, err, "goclub/time: DateRange.Begin can not be after DateRange.End")
assert.Errorf(t, err, "goclub/time: DateRange.Start can not be after DateRange.End")
}
// Begin<End
// Start<End
{
err := xtime.DateRange{
xtime.Date{}, xtime.NewDate(2000, 1, 1),
}.Validator()
assert.NoError(t, err)
}
// Begin=End
// Start=End
{
err := xtime.DateRange{
xtime.NewDate(2000, 1, 1), xtime.NewDate(2000, 1, 1),
}.Validator()
assert.NoError(t, err)
}
// Begin<End
// Start<End
{
err := xtime.DateRange{
xtime.NewDate(2000, 1, 1), xtime.NewDate(2000, 1, 2),
}.Validator()
assert.NoError(t, err)
}
}

func TestRange_Validator(t *testing.T) {
// start > end
{
err := xtime.Range{
time.Date(2000, 1, 2, 0, 0, 1, 0, time.Local),
time.Date(2000, 1, 1, 0, 0, 1, 0, time.Local),
}.Validator()
assert.Errorf(t, err, "goclub/time: Range.Start can not be after Range.End")
}
// start = end
{
err := xtime.Range{
time.Date(2000, 1, 1, 0, 0, 1, 0, time.Local),
time.Date(2000, 1, 1, 0, 0, 1, 0, time.Local),
}.Validator()
assert.NoError(t, err)
}
// start < end
{
err := xtime.Range{
time.Date(2000, 1, 1, 0, 0, 1, 0, time.Local),
time.Date(2000, 1, 2, 0, 0, 1, 0, time.Local),
}.Validator()
assert.NoError(t, err)
}
}

0 comments on commit b6f1ba8

Please sign in to comment.