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
|
// 获取当前时间,这是个奇葩,必须是这个时间点, 据说是go诞生之日, 记忆方法:6-1-2-3-4-5
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
// 获取当天的年月日时间
now := time.Now()
today := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local)
nowDayStart := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local)
nowDayEnd := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 59, time.Local)
// 获取时间戳
timeUnix := time.Now().Unix() //单位秒,10 位数
timeUnixMill := time.Now().UnixNano()/1e6 //单位毫秒,13 位数
timeUnixMicro := time.Now().UnixNano()/1e3 //单位微秒,16 位数
timeUnixNano := time.Now().UnixNano() //单位纳秒,19 位数
// 时间戳转为日期格式
timestamp := time.Unix(timestamp, 0).Format("2006-01-02 15:04:05") // 秒级时间戳转换成日期
timestamp := time.Unix(int64(timestamp/1e3), 0).Format("2006-01-02 15:04:05") // 毫秒级时间戳转换成日期
// 获取7月1日的time
month7Start = time.Date(now.Year(), 7, 1, 0, 0, 0, 0, time.Local)
// ISO8601标准日期格式
time.Now().UTC().Format(time.RFC3339) // 世界统一时间:2024-09-20T07:01:44Z
time.Now().Format(time.RFC3339) // 本地时区时间:2024-09-20T15:01:44+08:00
// 时间字符串转为 time.Time,再转时间戳 timeUnix := tTime.Unix()
startTime, _ := time.ParseInLocation("2006-01-02 15:04:05", "2024-02-28 10:24:26", time.Local)
func StringToTime(t string) (time.Time, error) {
location, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
return time.Time{}, err
}
tTime, _ := time.ParseInLocation("2006-01-02 15:04:05", t, location)
return tTime, nil
}
// time.Time 转为时间字符串
func FormatTime(time time.Time) string {
return time.Format("2006-01-02 15:04:05")
}
// time.RFC3339 时间格式化
func RFC3339ToTime(value string) (time.Time, error) {
return time.ParseInLocation(time.RFC3339, value, time.Local)
}
// 秒级时间戳转为 time.Time
datetime := time.Unix(int64(1629107978), 0)
// 未来第30天
lastDay := time.Now().AddDate(0, 0, 30).Format("2006-01-02")
// 获取5分钟前的时间
time.Now().Add(-time.Minute * 5)
// 获取 1 小时之前的时间
m, _ := time.ParseDuration("-1h")
result := currentTime.Add(m)
// 睡眠 1 秒和 0.5 秒
time.Sleep(time.Second)
time.Sleep(time.Microsecond * 500)
// 两个时间点相差的天数
now := time.Now()
today := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local)
futureDay := today.AddDate(0, 0, 1)
fmt.Printf("两个时间点相差的天数:%d\n", int(futureDay.Sub(today).Hours()/24)+1)
// 时间大小比较
now := time.Now()
a, _ := time.Parse("2006-01-02 15:04:05", "2019-03-10 11:00:00")
b, _ := time.Parse("2006-01-02 15:04:05", "2015-03-10 16:00:00")
fmt.Println("now a After: ",now.After(a))
fmt.Println("now a Before: ",now.Before(a))
// 时区设置,方法一:
var zone, _ = time.LoadLocation("Asia/Shanghai") // 地区标准时
fmt.Println(time.Now().In(zone).Format("2006-01-02 15:04:05"))
// 时区设置,方法二:
var zone = time.FixedZone("CST", 8*3600) // 东八区
fmt.Println(time.Now().In(zone).Format("2006-01-02 15:04:05"))
// 定时器: time.NewTimer 和 time.NewTicker
NewTimer: 只执行一次,到时间执行
NewTicker: 循环执行,只要定义完成,从此刻开始计时,不需要任何其他的操作,每隔固定时间都会触发。『相比 sleep,资源占用少』
func timer() {
timer := time.NewTimer(3 * time.Second)
select {
case <-timer.C:
fmt.Println("3秒执行任务")
}
timer.Stop() // 这里来提高 timer 的回收
}
func ticker(activityId, userId uint64) (bool, error) {
key := "keyxxx"
var times uint32
ticker := time.NewTicker(100 * time.Millisecond) // 定时器,定时往 channel 追加数据
defer ticker.Stop()
for {
isLock := db.Redis(db.Default).SetNX(key, userId, 1*time.Minute).Val() // 利用 redis 加锁
if isLock { // 是否是自身上锁
return true, nil
}
// 避免用户等待时间过长
times++
if times > 100 {
return false, errors.New("抽奖失败")
}
<-ticker.C // 定时器时间未到,阻塞,相当于 sleep
}
}
|