时间格式化
nowTime := time.Now()
fmt.Println(nowTime.Format("20060102")) //相当于Ymd
fmt.Println(nowTime.Format("2006-01-02"))//相当于Y-m-d
fmt.Println(nowTime.Format("2006-01-02 15:04:05"))//相当于Y-m-d H:i:s
fmt.Println(nowTime.Format("2006-01-02 00:00:00"))//相当于Y-m-d 00:00:00
比较时间
使用time的Before、Equal、After方法。
time1 := "2015-03-20 08:50:29"
time2 := "2015-03-21 09:04:25"
//先把时间字符串格式化成相同的时间类型
t1, err := time.Parse("2006-01-02 15:04:05", time1)
t2, err := time.Parse("2006-01-02 15:04:05", time2)
if err == nil && t1.Before(t2) {
//处理逻辑
fmt.Println("true")
}
时间节点之前的时间
currentTime := time.Now()
oldTime := currentTime.AddDate(0, 0, -180) // 180天前
获取时间戳
timeUnix:=time.Now().In(time.local).Unix() //单位s,打印结果:1491888244
timeUnixNano:=time.Now().In(time.local).UnixNano() //单位纳秒,打印结果:1491888244752784461
timeUnixNano:=time.Now().In(time.local).UnixNano() / 1e6 //单位毫秒
时间戳转时间
//时间戳 to 时间
tm := time.Unix(1531293019, 0)
fmt.Println(tm.Format("2006-01-02 15:04:05")) //2018-07-11 15:10:19
时区设置
time包设置时区
l,_ := time.LoadLocation("Asia/Shanghai")
fmt.Println(time.Now().In(l))
l,_ = time.LoadLocation("America/Adak")
fmt.Println(time.Now().In(l))
// 本地时区
fmt.Println(time.Now().In(time.local))
或者
currentTime := time.Now()
date := time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(), 0, 0, 0, 0, currentTime.Location())
date, err := time.Parse("2006-01-02", date.Format("2006-01-02"))
注意
t, err := time.Parse("2006-01-02 15:04:05", time.Now().Format("2006-01-02 15:04:05"))
fmt.Println(t)
结果:
// 假设当前时间 2017-12-03 12:00:00 +0000 UTC
2020-03-09 20:00:00 +0000 UTC
发现时间多了8个小时
在windows下,time.Parse()的时区和time.Format()的时区是一致的。
但是在linux环境下,time.Parse()的默认时区是UTC,time.Format()的时区默认是本地,两者如果不处理好就会导致错误
解决:
使用time.ParseInLocation()而不是time.Parse():
t, _ := time.ParseInLocation("2006-01-02 15:04:05", time.Now().Format("2006-01-02 15:04:05"), time.Local)
通道
Go语言中的time包提供了计时器的封装。
time.AfterFunc()函数是在time.After基础上增加了到时的回调,方便使用。
计时器 、打点器
计时器(Timer)的原理和倒计时闹钟类似,都是给定多少时间后触发。打点器(Ticker)的原理和钟表类似,钟表每到整点就会触发。这两种方法创建后会返回time.Ticker对象和time.Timer对象,里面通过一个C成员,类型是只能接收的时间通道(<-chan Time),使用这个通道就可以获得时间触发的通知
package main
import (
”fmt”
”time”
)
func main() (
//创建一个打点器,每500毫秒触发一次
ticker := time.NewTicker(time.Millisecond * 500)
//创建一个计时器,2秒后触发
stopper := time.NewTimer(time.Second * 2)
//声明计数变量
var i int
//不断地检查通道情况
for {
//多路复用通道
select
case <-ticker.C://计时器到时了
fmt.Println(”stop”)
// 跳出循环
goto Stop Here
case <-stopper.C: //打点器触发了
//记录触发了多少次
i++
fmt.Println(”tick”, i)
}
//退出的标签, 使用goto跳转
Stop Here:
fmt.Println(”done”)
}