zoukankan      html  css  js  c++  java
  • 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”)
    }
    
  • 相关阅读:
    正则表达式分类
    数据思维二三事
    关于编程语言的一些趣史
    重构后端模板文件的一种实践
    为什么程序员需要知道互联网行业发展史
    探秘JS的异步单线程
    Nerd的畅销产品
    Nerd的套现ATM机
    网络传输与加密 (2)
    网络传输与加密
  • 原文地址:https://www.cnblogs.com/followyou/p/12187949.html
Copyright © 2011-2022 走看看