Go时间技巧
一、时间格式化与转化
日期字符串(2014-11-12 11:45:26)需要转化为Go的time类型
一般使用Parse(layout, value string) (Time, error)
方法处理,但是Go中默认使用UTC时区,会导致日期时间转化错误!!
在time.Now()
中获取的时间是本地时区时间。
解决方案:使用ParseInLocation
方法手动指定时区
1 | timeTransited, err := time.ParseInLocation(format, objToTrans, location) |
封装方法:
1 | package utils |
二、时间范围
- 小于 && 小于
1
2
3
4
5
6//
now := time.Now()
//现在在xxx之前。返回的是bool
now.Before()
//现在在xxx之后。返回的是bool
now.After() - 在一个范围内
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133// Package utils
// @author: BaiYZ
// @description:
// @file: time.go
// @version: 1.0.0
// @date: 7/14/2022 9:44 上午
package utils
import (
"errors"
"time")
const (
// DEFAULTTIMETEMPLATE 默认时间格式
DEFAULTTIMETEMPLATE = "2006-01-02 15:04:05"
)
// JudgeTimeBetweenTheRangeUseTime
// @Description: 判断目标时间是否在制定时间范围内(左闭右开,左开右闭..)
// @param startTime 开始时间
// @param endTime 结束时间
// @param objTime 目标时间
// @param left 是否允许左区间取值
// @param right 是否允许右区间取值
// @return bool true/false
// @return error 错误
func JudgeTimeBetweenTheRangeUseTime(startTime time.Time, endTime time.Time, objTime time.Time, left bool, right bool) (bool, error) {
if left {
if right && (objTime.Before(startTime) || objTime.After(endTime)) {
return false, nil
}
if !right && (objTime.Before(startTime) || (objTime.After(endTime) || objTime.Equal(endTime))) {
return false, nil
}
return true, nil
} else {
if right && ((objTime.Before(startTime) || objTime.Equal(startTime)) || objTime.After(endTime)) {
return false, nil
}
if !right && ((objTime.Before(startTime) || objTime.Equal(startTime)) || (objTime.After(endTime) || objTime.Equal(endTime))) {
return false, nil
}
return true, nil
}
}
// JudgeTimeBetweenTheRangeUseTimeInterface
// @Description: 通用时间区间判断,支持time类型以及字符串类型(格式:2006-01-02 15:04:05)string string string 、string string time 、time time time
// @param startTime 开始
// @param endTime 结束
// @param objTime 目标
// @param location 时区
// @param left 左区间
// @param right 右区间
// @return bool 结果
// @return error 错误
func JudgeTimeBetweenTheRangeUseTimeInterface(startTime interface{}, endTime interface{}, objTime interface{}, location *time.Location, left bool, right bool) (bool, error) {
if location == nil {
location = time.Local
}
if objTime == nil {
objTime = time.Local
}
// 进行类型断言
start, startOk := startTime.(time.Time)
end, endOk := endTime.(time.Time)
obj, objOk := objTime.(time.Time)
if startOk && endOk && objOk {
ans, err := JudgeTimeBetweenTheRangeUseTime(start, end, obj, left, right)
if err != nil {
return false, err
}
return ans, nil
}
// 全部字符串类型断言
startStr, startOk := startTime.(string)
endStr, endOk := endTime.(string)
objStr, objOk := objTime.(string)
if startOk && endOk && objOk {
start, err := GetTimeUseStringTemplate(startStr, location)
if err != nil {
return false, err
}
end, err := GetTimeUseStringTemplate(endStr, location)
if err != nil {
return false, err
}
obj, err := GetTimeUseStringTemplate(objStr, location)
if err != nil {
return false, err
}
ans, err := JudgeTimeBetweenTheRangeUseTime(start, end, obj, left, right)
if err != nil {
return false, err
}
return ans, nil
}
// 前两个字符串 后一个time类型
startT, startOk := startTime.(string)
endT, endOk := endTime.(string)
objT, objOk := objTime.(time.Time)
if startOk && endOk && objOk {
start, err := GetTimeUseStringTemplate(startT, location)
if err != nil {
return false, err
}
end, err := GetTimeUseStringTemplate(endT, location)
if err != nil {
return false, err
}
ans, err := JudgeTimeBetweenTheRangeUseTime(start, end, objT, left, right)
if err != nil {
return false, err
}
return ans, nil
}
return false, errors.New("do not support to trans")
}
// GetTimeUseStringTemplate
// @Description: 通过制定字符串以及时区转化为time.Time对象,支持默认值 不传递字符串模板使用默认,不传递时区使用本地时区 "2006-01-02 15:04:05"// @param timeToTrans 待转化的时间字符串
// @param location 时区
// @return time.Time
// @return error
func GetTimeUseStringTemplate(timeToTrans string, location *time.Location) (time.Time, error) {
if timeToTrans == "" {
return time.Time{}, errors.New("invade time string , can't be trans")
} else if location != nil {
return time.ParseInLocation(DEFAULTTIMETEMPLATE, timeToTrans, location)
} else {
return time.ParseInLocation(DEFAULTTIMETEMPLATE, timeToTrans, time.Local)
}}
测试:
1 | // Package |