前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go之time包用法

Go之time包用法

作者头像
孤烟
发布2022-03-22 16:49:22
3340
发布2022-03-22 16:49:22
举报
文章被收录于专栏:golang开发笔记golang开发笔记

Go之time包用法

time包提供了时间的显示和测量用的函数。日历的计算采用的是公历。 time 类型

代码语言:javascript
复制
type Time struct {
// wall and ext encode the wall time seconds, wall time nanoseconds,
// and optional monotonic clock reading in nanoseconds.
//
// From high to low bit position, wall encodes a 1-bit flag (hasMonotonic),
// a 33-bit seconds field, and a 30-bit wall time nanoseconds field.
// The nanoseconds field is in the range [0, 999999999].
// If the hasMonotonic bit is 0, then the 33-bit field must be zero
// and the full signed 64-bit wall seconds since Jan 1 year 1 is stored in ext.
// If the hasMonotonic bit is 1, then the 33-bit field holds a 33-bit
// unsigned wall seconds since Jan 1 year 1885, and ext holds a
// signed 64-bit monotonic clock reading, nanoseconds since process start.
wall uint64
ext  int64

    // loc specifies the Location that should be used to
    // determine the minute, hour, month, day, and year
    // that correspond to this Time.
    // The nil location means UTC.
    // All UTC times are represented with loc==nil, never loc==&utcLoc.
    loc *Location
}

time可以精确到纳秒 示例

代码语言:javascript
复制
package main

import (
    "fmt"
    "time"
)

func main() {
    t:=time.Now()
    fmt.Println(t)//获取当前时间2021-09-23 10:55:44.831571 +0800 CST m=+0.000090412
    fmt.Println(t.Unix())//获取当前时间时间戳 1632366278
    fmt.Println(t.UnixMilli())//获取当前时间毫秒 1632366278605
    fmt.Println(t.UnixMicro())//获取当前时间微秒 1632366278605122
    fmt.Println(t.UnixNano())//获取当前时间时纳秒 1632366278605122000
    fmt.Println(t.Hour())//获取当前小时 10
    fmt.Println(t.Day())//获取当前天 23
    fmt.Println(t.Weekday())//获取当前周Thursday
    fmt.Println(t.ISOWeek())//获取当前周2021 38

    //格式化当前时间表示
    fmt.Println(t.String())//字符型
    fmt.Println(t.Format("2006-01-02 15:04:05"))//2021-09-23 11:12:42
    fmt.Println(t.Format("2006-01-02"))//2021-09-23
    fmt.Println(t.Format("15:04:05"))//11:12:42

    //指定时间戳转换
    fmt.Println(time.Unix(1632366278, 0).Format("2006-01-02 15:04:05"))//2021-09-23 11:04:38
    //指定时间转时间戳
    tm2, _ := time.Parse("2006-01-02 15:04:05", "2021-09-23 11:04:38")
    fmt.Println( tm2.Unix())//1632395078

    //"2021-09-08T08:18:46+08:00" 转2021-09-08 08:18:46
    t, _= time.Parse(time.RFC3339, "2021-09-08T08:18:46+08:00")
    fmt.Println(t.Format("2006-01-02 15:04:05"))
    //2021-09-07T17:01:34.182659088Z 转2021-09-07 17:01:34
    t, _= time.Parse(time.RFC3339Nano, "2021-09-07T17:01:34.182659088Z")
    fmt.Println(t.Format("2006-01-02 15:04:05"))
    //其他格式类似可参考

    //ANSIC       = "Mon Jan _2 15:04:05 2006"
    //UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
    //RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
    //RFC822      = "02 Jan 06 15:04 MST"
    //RFC822Z     = "02 Jan 06 15:04 -0700" // 使用数字表示时区的RFC822
    //RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
    //RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
    //RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // 使用数字表示时区的RFC1123
    //RFC3339     = "2006-01-02T15:04:05Z07:00"
    //RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
    //Kitchen     = "3:04PM"
    //// 方便的时间戳
    //Stamp      = "Jan _2 15:04:05"
    //StampMilli = "Jan _2 15:04:05.000"
    //StampMicro = "Jan _2 15:04:05.000000"
    //StampNano  = "Jan _2 15:04:05.000000000"

     //设置时区 Location
    //默认UTC
    loc, _ := time.LoadLocation("")
    // 服务器设定的时区,一般为CST
    //loc, _ := time.LoadLocation("Local")
    //loc, _ := time.LoadLocation("Asia/Shanghai")
    t.In(loc).Format("2006-01-02 15:04:05");

    //1.5s后
    now := time.Now()
    tp, _ := time.ParseDuration("1.5s")
    fmt.Println(tp,tp.Truncate(1000), tp.Seconds(), tp.Nanoseconds())
    m1 := now.Add(tp)
    fmt.Println(m1)//2021-09-23 14:30:42.006213 +0800 CST m=+1.500352171

    //1个小时前
    tp, _ = time.ParseDuration("-1h")

    m1 = now.Add(tp)
    fmt.Println(m1)//2021-09-23 13:30:40.506213 +0800 CST m=-3599.999647829
    //休眠时间
    //time.Sleep(time.Duration(10) * time.Second)

    // func After(d Duration) <-chan Time  非阻塞,可用于延迟
    //time.After(time.Duration(10) * time.Second)



    // func Since(t Time) Duration 两个时间点的间隔
    start := time.Now()
    fmt.Println(time.Since(start))   // 等价于 Now().Sub(t), 可用来计算一段业务的消耗时间

    //func Until(t Time) Duration     //  等价于 t.Sub(Now()),t与当前时间的间隔


    time3 := "2021-03-20 08:50:29"
    time4 := "2021-03-20 08:50:29"
    //先把时间字符串格式化成相同的时间类型
    t3, _ := time.Parse("2006-01-02 15:04:05", time3)
    t4, _ := time.Parse("2006-01-02 15:04:05", time4)

    fmt.Println(t3.Equal(t4)) //true


    now = time.Now()
    //Ticker 类型包含一个 channel,有时我们会遇到每隔一段时间执行的业务(比如设置心跳时间等),就可以用它来处理,这是一个重复的过程

    // 无法取消
    //tick := time.Tick(1 * time.Minute)
    //for _ = range tick {
    //    // do something
    //}
    //NewTicker返回一个新的Ticker,该Ticker包含一个通道字段,并会每隔时间段d就向该通道发送当时的时间。它会调整时间间隔或者丢弃tick信息以适应反应慢的接收者。如果d<=0会panic。关闭该Ticker可以释放相关资源。
    // 可通过调用ticker.Stop取消
    //创建一个周期性的定时器
    //设置定时器为3秒
    timer := time.NewTimer(3 * time.Second)
    fmt.Println("当前时间为:", time.Now())

    t = <-timer.C //从定时器拿数据
    fmt.Println("当前时间为:", t)
    timer.Stop()//停止
    
}

links

https://studygolang.com/pkgdoc

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Go之time包用法
  • links
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档