forked from taosdata/tdengine_gorm
/
duration.go
69 lines (62 loc) · 1.42 KB
/
duration.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package window
import (
"errors"
"strconv"
"time"
)
type UnitType string
//u(微秒)、a(毫秒)、s(秒)、m(分)、h(小时)、d(天)、w(周) n(自然月) 和 y(自然年)
const (
Microsecond UnitType = "u"
Millisecond UnitType = "a"
Second UnitType = "s"
Minute UnitType = "m"
Hour UnitType = "h"
Day UnitType = "d"
Week UnitType = "w"
Month UnitType = "n"
Year UnitType = "y"
)
var durationMap = map[UnitType]struct{}{
Microsecond: {},
Millisecond: {},
Second: {},
Minute: {},
Hour: {},
Day: {},
Week: {},
Month: {},
Year: {},
}
type Duration struct {
Value uint64
Unit UnitType
}
func NewDurationFromTimeDuration(duration time.Duration) (*Duration, error) {
if duration <= 0 {
return nil, errors.New("duration does not allow negative numbers")
}
return &Duration{
Value: uint64(duration.Microseconds()),
Unit: Microsecond,
}, nil
}
func ParseDuration(durationString string) (*Duration, error) {
if len(durationString) < 2 {
return nil, errors.New("parse duration error")
}
unit := UnitType(durationString[len(durationString)-1:])
_, valid := durationMap[unit]
if !valid {
return nil, errors.New("unit not valid")
}
value := durationString[:len(durationString)-1]
v, err := strconv.ParseUint(value, 10, 64)
if err != nil {
return nil, err
}
return &Duration{
Value: v,
Unit: unit,
}, nil
}