@@ -7,18 +7,30 @@ import (
7
7
8
8
// ------------------------------------------------ ---------------------------------------------------------------------
9
9
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
+
12
20
deltaSlice := make ([]uint64 , len (timeSlice ))
13
21
for index , t := range timeSlice {
22
+
23
+ // 第一个保持原样
14
24
if index == 0 {
15
25
deltaSlice [index ] = uint64 (t .UnixMilli ())
16
26
continue
17
27
}
18
- switch compareToType {
28
+
29
+ //从第二个开始就要delta了
30
+ switch compareToType [0 ] {
19
31
case CompareToFirst :
20
32
deltaSlice [index ] = TimeDelta (t , timeSlice [0 ])
21
- case CompareToLast :
33
+ case CompareToPrevious :
22
34
deltaSlice [index ] = TimeDelta (t , timeSlice [index - 1 ])
23
35
default :
24
36
panic (fmt .Errorf ("not support compare type: %#v" , compareToType ))
@@ -28,44 +40,60 @@ func ToTimeSliceDelta(timeSlice []time.Time, compareToType CompareToType) []uint
28
40
}
29
41
30
42
// 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 ))
33
50
for index , delta := range deltaSlice {
51
+
34
52
if index == 0 {
35
53
timeSlice [index ] = time .UnixMilli (int64 (delta ))
36
54
continue
37
55
}
38
- switch compareToType {
56
+
57
+ switch compareToType [0 ] {
39
58
case CompareToFirst :
40
59
timeSlice [index ] = time .UnixMilli (int64 (deltaSlice [0 ] + delta ))
41
- case CompareToLast :
60
+ case CompareToPrevious :
42
61
timeSlice [index ] = timeSlice [index - 1 ].Add (time .Millisecond * time .Duration (delta ))
43
62
default :
44
63
panic (fmt .Errorf ("not support compare type: %#v" , compareToType ))
45
64
}
65
+
46
66
}
67
+
47
68
return timeSlice
48
69
}
49
70
50
- // TimeDelta 求两个时间的差
71
+ // TimeDelta 求两个时间的毫秒差
51
72
func TimeDelta (t1 time.Time , t2 time.Time ) uint64 {
52
73
return uint64 (t1 .UnixMilli () - t2 .UnixMilli ())
53
74
}
54
75
55
76
// ------------------------------------------------ ---------------------------------------------------------------------
56
77
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
+
59
85
deltaSlice := make ([]uint64 , len (timestampSlice ))
60
86
for index , timestamp := range timestampSlice {
87
+
61
88
if index == 0 {
62
89
deltaSlice [index ] = timestamp
63
90
continue
64
91
}
65
- switch compareToType {
92
+
93
+ switch compareToType [0 ] {
66
94
case CompareToFirst :
67
95
deltaSlice [index ] = timestamp - timestampSlice [0 ]
68
- case CompareToLast :
96
+ case CompareToPrevious :
69
97
deltaSlice [index ] = timestamp - timestampSlice [index - 1 ]
70
98
default :
71
99
panic (fmt .Errorf ("not support compare type: %#v" , compareToType ))
@@ -75,21 +103,29 @@ func ToTimestampSliceDelta(timestampSlice []uint64, compareToType CompareToType)
75
103
}
76
104
77
105
// 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 ))
80
113
for index , delta := range deltaSlice {
114
+
81
115
if index == 0 {
82
116
timeSlice [index ] = delta
83
117
continue
84
118
}
85
- switch compareToType {
119
+
120
+ switch compareToType [0 ] {
86
121
case CompareToFirst :
87
122
timeSlice [index ] = deltaSlice [0 ] + delta
88
- case CompareToLast :
123
+ case CompareToPrevious :
89
124
timeSlice [index ] = timeSlice [index - 1 ] + delta
90
125
default :
91
126
panic (fmt .Errorf ("not support compare type: %#v" , compareToType ))
92
127
}
128
+
93
129
}
94
130
return timeSlice
95
131
}
0 commit comments