Go 时间

目录

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.New Ticker(time.Millisecond * 500)
    //创建一个计时器,2秒后触发
    stopper:=time.New Timer(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”)
}