Skip to content

Commit 43e5d98

Browse files
committed
feat: 完善time delta并添加对应单元测试
1 parent f1a03ad commit 43e5d98

File tree

2 files changed

+135
-29
lines changed

2 files changed

+135
-29
lines changed

time.go

+53-17
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,30 @@ import (
77

88
// ------------------------------------------------ ---------------------------------------------------------------------
99

10-
// ToTimeSliceDelta 对时间序列做delta
11-
func ToTimeSliceDelta(timeSlice []time.Time, compareToType CompareToType) []uint64 {
10+
// DefaultCompareToType 如果未指定delta的时候的比较对象的话,则默认将当前时间与序列相邻的上一个时间做delta比较
11+
const DefaultCompareToType = CompareToPrevious
12+
13+
// ToTimeSliceDelta 对时间序列在毫秒单位做delta
14+
func ToTimeSliceDelta(timeSlice []time.Time, compareToType ...CompareToType) []uint64 {
15+
16+
if len(compareToType) == 0 {
17+
compareToType = append(compareToType, DefaultCompareToType)
18+
}
19+
1220
deltaSlice := make([]uint64, len(timeSlice))
1321
for index, t := range timeSlice {
22+
23+
// 第一个保持原样
1424
if index == 0 {
1525
deltaSlice[index] = uint64(t.UnixMilli())
1626
continue
1727
}
18-
switch compareToType {
28+
29+
//从第二个开始就要delta了
30+
switch compareToType[0] {
1931
case CompareToFirst:
2032
deltaSlice[index] = TimeDelta(t, timeSlice[0])
21-
case CompareToLast:
33+
case CompareToPrevious:
2234
deltaSlice[index] = TimeDelta(t, timeSlice[index-1])
2335
default:
2436
panic(fmt.Errorf("not support compare type: %#v", compareToType))
@@ -28,44 +40,60 @@ func ToTimeSliceDelta(timeSlice []time.Time, compareToType CompareToType) []uint
2840
}
2941

3042
// FromTimeSliceDelta 从Time的delta恢复时间序列
31-
func FromTimeSliceDelta(deltaSlice []uint64, compareToType CompareToType) []time.Time {
32-
timeSlice := make([]time.Time, 0)
43+
func FromTimeSliceDelta(deltaSlice []uint64, compareToType ...CompareToType) []time.Time {
44+
45+
if len(compareToType) == 0 {
46+
compareToType = append(compareToType, DefaultCompareToType)
47+
}
48+
49+
timeSlice := make([]time.Time, len(deltaSlice))
3350
for index, delta := range deltaSlice {
51+
3452
if index == 0 {
3553
timeSlice[index] = time.UnixMilli(int64(delta))
3654
continue
3755
}
38-
switch compareToType {
56+
57+
switch compareToType[0] {
3958
case CompareToFirst:
4059
timeSlice[index] = time.UnixMilli(int64(deltaSlice[0] + delta))
41-
case CompareToLast:
60+
case CompareToPrevious:
4261
timeSlice[index] = timeSlice[index-1].Add(time.Millisecond * time.Duration(delta))
4362
default:
4463
panic(fmt.Errorf("not support compare type: %#v", compareToType))
4564
}
65+
4666
}
67+
4768
return timeSlice
4869
}
4970

50-
// TimeDelta 求两个时间的差
71+
// TimeDelta 求两个时间的毫秒差
5172
func TimeDelta(t1 time.Time, t2 time.Time) uint64 {
5273
return uint64(t1.UnixMilli() - t2.UnixMilli())
5374
}
5475

5576
// ------------------------------------------------ ---------------------------------------------------------------------
5677

57-
// ToTimestampSliceDelta 对时间戳做delta
58-
func ToTimestampSliceDelta(timestampSlice []uint64, compareToType CompareToType) []uint64 {
78+
// ToTimestampSliceDelta 对时间戳做delta,这个时间戳可以根据自己需要,可以是10位的描述,也可以是13位的毫秒数
79+
func ToTimestampSliceDelta(timestampSlice []uint64, compareToType ...CompareToType) []uint64 {
80+
81+
if len(compareToType) == 0 {
82+
compareToType = append(compareToType, DefaultCompareToType)
83+
}
84+
5985
deltaSlice := make([]uint64, len(timestampSlice))
6086
for index, timestamp := range timestampSlice {
87+
6188
if index == 0 {
6289
deltaSlice[index] = timestamp
6390
continue
6491
}
65-
switch compareToType {
92+
93+
switch compareToType[0] {
6694
case CompareToFirst:
6795
deltaSlice[index] = timestamp - timestampSlice[0]
68-
case CompareToLast:
96+
case CompareToPrevious:
6997
deltaSlice[index] = timestamp - timestampSlice[index-1]
7098
default:
7199
panic(fmt.Errorf("not support compare type: %#v", compareToType))
@@ -75,21 +103,29 @@ func ToTimestampSliceDelta(timestampSlice []uint64, compareToType CompareToType)
75103
}
76104

77105
// FromTimestampSliceDelta 从时间戳的delta恢复时间戳序列
78-
func FromTimestampSliceDelta(deltaSlice []uint64, compareToType CompareToType) []uint64 {
79-
timeSlice := make([]uint64, 0)
106+
func FromTimestampSliceDelta(deltaSlice []uint64, compareToType ...CompareToType) []uint64 {
107+
108+
if len(compareToType) == 0 {
109+
compareToType = append(compareToType, DefaultCompareToType)
110+
}
111+
112+
timeSlice := make([]uint64, len(deltaSlice))
80113
for index, delta := range deltaSlice {
114+
81115
if index == 0 {
82116
timeSlice[index] = delta
83117
continue
84118
}
85-
switch compareToType {
119+
120+
switch compareToType[0] {
86121
case CompareToFirst:
87122
timeSlice[index] = deltaSlice[0] + delta
88-
case CompareToLast:
123+
case CompareToPrevious:
89124
timeSlice[index] = timeSlice[index-1] + delta
90125
default:
91126
panic(fmt.Errorf("not support compare type: %#v", compareToType))
92127
}
128+
93129
}
94130
return timeSlice
95131
}

time_test.go

+82-12
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,99 @@
11
package delta
22

33
import (
4+
"github.com/stretchr/testify/assert"
45
"testing"
6+
"time"
57
)
68

7-
func TestFromTimeSliceDelta(t *testing.T) {
8-
// TODO
9-
10-
}
9+
func TestToTimeSliceDelta(t *testing.T) {
10+
firstTime := time.Now()
11+
timeSlice := []time.Time{
12+
firstTime,
13+
firstTime.Add(time.Second * 1),
14+
firstTime.Add(time.Second * 2),
15+
firstTime.Add(time.Second * 3),
16+
firstTime.Add(time.Second * 4),
17+
}
1118

12-
func TestFromTimestampSliceDelta(t *testing.T) {
13-
// TODO
19+
// 都与第一个做比较
20+
deltaSlice := ToTimeSliceDelta(timeSlice, CompareToFirst)
21+
assert.Equal(t, []uint64{
22+
uint64(firstTime.UnixMilli()),
23+
uint64(1000), uint64(2000), uint64(3000), uint64(4000),
24+
}, deltaSlice)
1425

26+
// 都与上一个做比较
27+
deltaSlice = ToTimeSliceDelta(timeSlice, CompareToPrevious)
28+
assert.Equal(t, []uint64{
29+
uint64(firstTime.UnixMilli()),
30+
uint64(1000), uint64(1000), uint64(1000), uint64(1000),
31+
}, deltaSlice)
1532
}
1633

17-
func TestTimeDelta(t *testing.T) {
18-
// TODO
34+
func TestFromTimeSliceDelta(t *testing.T) {
35+
firstTime := time.Unix(1698509341981, 0)
36+
timeSlice := []time.Time{
37+
firstTime,
38+
firstTime.Add(time.Second * 1),
39+
firstTime.Add(time.Second * 2),
40+
firstTime.Add(time.Second * 3),
41+
firstTime.Add(time.Second * 4),
42+
}
43+
44+
// 都与第一个做比较
45+
deltaSlice := ToTimeSliceDelta(timeSlice, CompareToFirst)
46+
recoveredSlice := FromTimeSliceDelta(deltaSlice, CompareToFirst)
47+
assert.Equal(t, timeSlice, recoveredSlice)
1948

49+
// 都与上一个作比较
50+
deltaSlice = ToTimeSliceDelta(timeSlice, CompareToPrevious)
51+
recoveredSlice = FromTimeSliceDelta(deltaSlice, CompareToPrevious)
52+
assert.Equal(t, timeSlice, recoveredSlice)
2053
}
2154

22-
func TestTimeSliceDelta(t *testing.T) {
55+
func TestToTimestampSliceDelta(t *testing.T) {
56+
firstTimestamp := uint64(time.Now().UnixMilli())
57+
timeSlice := []uint64{
58+
firstTimestamp,
59+
firstTimestamp + 1,
60+
firstTimestamp + 2,
61+
firstTimestamp + 3,
62+
firstTimestamp + 4,
63+
}
2364

24-
// TODO
65+
// 都与第一个做比较
66+
deltaSlice := ToTimestampSliceDelta(timeSlice, CompareToFirst)
67+
assert.Equal(t, []uint64{
68+
firstTimestamp,
69+
uint64(1), uint64(2), uint64(3), uint64(4),
70+
}, deltaSlice)
71+
72+
// 都与上一个做比较
73+
deltaSlice = ToTimestampSliceDelta(timeSlice, CompareToPrevious)
74+
assert.Equal(t, []uint64{
75+
firstTimestamp,
76+
uint64(1), uint64(1), uint64(1), uint64(1),
77+
}, deltaSlice)
2578
}
2679

27-
func TestTimestampSliceDelta(t *testing.T) {
28-
// TODO
80+
func TestFromTimestampSliceDelta(t *testing.T) {
81+
firstTime := uint64(1698509341981)
82+
timeSlice := []uint64{
83+
firstTime,
84+
firstTime + 1,
85+
firstTime + 2,
86+
firstTime + 3,
87+
firstTime + 4,
88+
}
89+
90+
// 都与第一个做比较
91+
deltaSlice := ToTimestampSliceDelta(timeSlice, CompareToFirst)
92+
recoveredSlice := FromTimestampSliceDelta(deltaSlice, CompareToFirst)
93+
assert.Equal(t, timeSlice, recoveredSlice)
94+
95+
// 都与上一个作比较
96+
deltaSlice = ToTimestampSliceDelta(timeSlice, CompareToPrevious)
97+
recoveredSlice = FromTimestampSliceDelta(deltaSlice, CompareToPrevious)
98+
assert.Equal(t, timeSlice, recoveredSlice)
2999
}

0 commit comments

Comments
 (0)