-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
time.go
67 lines (56 loc) · 1.86 KB
/
time.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
package storage
import (
"fmt"
"time"
)
// timestampToTime returns time representation of the given timestamp.
//
// The returned time is in UTC timezone.
func timestampToTime(timestamp int64) time.Time {
return time.Unix(timestamp/1e3, (timestamp%1e3)*1e6).UTC()
}
// timestampFromTime returns timestamp value for the given time.
func timestampFromTime(t time.Time) int64 {
// There is no need in converting t to UTC, since UnixNano must
// return the same value for any timezone.
return t.UnixNano() / 1e6
}
// TimeRange is time range.
type TimeRange struct {
MinTimestamp int64
MaxTimestamp int64
}
func (tr *TimeRange) String() string {
minTime := timestampToTime(tr.MinTimestamp)
maxTime := timestampToTime(tr.MaxTimestamp)
return fmt.Sprintf("[%s - %s]", minTime, maxTime)
}
// timestampToPartitionName returns partition name for the given timestamp.
func timestampToPartitionName(timestamp int64) string {
t := timestampToTime(timestamp)
return t.Format("2006_01")
}
// fromPartitionName initializes tr from the given parition name.
func (tr *TimeRange) fromPartitionName(name string) error {
t, err := time.Parse("2006_01", name)
if err != nil {
return fmt.Errorf("cannot parse partition name %q: %s", name, err)
}
tr.fromPartitionTime(t)
return nil
}
// fromPartitionTimestamp initializes tr from the given partition timestamp.
func (tr *TimeRange) fromPartitionTimestamp(timestamp int64) {
t := timestampToTime(timestamp)
tr.fromPartitionTime(t)
}
// fromPartitionTime initializes tr from the given partition time t.
func (tr *TimeRange) fromPartitionTime(t time.Time) {
y, m, _ := t.UTC().Date()
minTime := time.Date(y, m, 1, 0, 0, 0, 0, time.UTC)
maxTime := time.Date(y, m+1, 1, 0, 0, 0, 0, time.UTC)
tr.MinTimestamp = minTime.Unix() * 1e3
tr.MaxTimestamp = maxTime.Unix()*1e3 - 1
}
const msecPerDay = 24 * 3600 * 1000
const msecPerHour = 3600 * 1000