开发者

一篇文章带你搞懂Go语言标准库Time

目录
  • 前言
  • 时间类型
  • 时间戳
  • 时间间隔
  • 操作时间
    • Add
    • Sub
    • Equal
    • Before
    • After
  • 定时器
    • 时间格式化
      • 解析字符串格式的时间
    • 总结

      前言

      在编程过程中,我们经常会用到与时间和日期相关的各种需求,下面来介绍 Go 语言中有关时间的一些基本用法。

      时间类型

      time.Time 类型表示时间。可以通过 time.Now() 函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息。

      示例代码如下:

      func main() {
        now := time.Now() //获取当前时间
        fmt.Printf("当前时间:%v\n", now)
        //当前时间:2021-12-26编程客栈 09:38:42.334358833 +0000 UTC m=+0.000056108
      	
        year := now.Year()     //年
        month := now.Month()   //月
        day := now.Day()       //日
        hour := now.Hour()     //小时
        minute := now.Minute() //分钟
        second := now.Second() //秒
        fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
        fmt.Printf("%T,%T,%T,%T,%T,%T,%T\n", now, year, month, day, hour, minute, second)
        //time.Time,int,tipythonme.Month,int,int,int,int
      }

      时间戳

      时间戳是自1970年1月1日(08:00:00GMT)至当前时间的总毫秒数。它也被称为Unix时间戳(UnixTimestamp)。在 golang 中,获取时间戳的操作如下:

      func main() {
        now := time.Now()            //获取当前时间
        timestamp1 := now.Unix()    www.devze.com //时间戳
        timestamp2 := now.UnixNano() //纳秒时间戳
        fmt.Printf("current timestamp1:%v\n", timestamp1)
        fmt.Printf("current timestamp2:%v\n", timestamp2)
      }

      可以通过 time.Unix来直接将时间戳转化为当前时间格式。

      func mainandroid() {
        timestamp := time.Now().Unix()
        timeObj := time.Unix(timestamp, 0) //将时间戳转为时间格式
        fmt.Println(timeObj) //2021-12-26 09:47:39 +0000 UTC
        year := timeObj.Year()     //年
        month := timeObj.Month()   //月
        day := timeObj.Day()       //日
        hour := timeObj.Hour()     //小时
        minute := timeObj.Minute() //分钟
        second := timeObj.Second() //秒
        fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second) //2021-12-26 09:47:39
      }

      时间间隔

      time.Duration是time包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。time.Duration表示一段时间间隔,可表示的最长时间段大约290年。

      time包中定义的时间间隔类型的常量如下:

      const (
          Nanosecond  Duration = 1
          Microsecond          = 1000 * 开发者_JS开发Nanosecond
          Millisecond          = 1000 * Microsecond
          Second               = 1000 * Millisejscond
          Minute               = 60 * Second
          Hour                 = 60 * Minute
      )

      例如:time.Duration表示1纳秒,time.Second表示1秒。

      操作时间

      Add

      对于时间+时间间隔的需求,我们可以使用 Add 方法如下:

      func (t Time) Add(d Duration) Time

      func main() {
      	now := time.Now()
      	fmt.Println(now)
      	
      	h := time.Duration(1)
      	m := time.Duration(2)
      	s := time.Duration(3)
      	// 当前时间加1小时2分3秒后的时间
      	later := now.Add(time.Hour*h + time.Minute*m + time.Second*s) 
      	fmt.Println(later)
      }

      注意在这里并不能增加年\月\日,仅能增加时分秒,也就是时间间隔 time.Duration 类型中的常量。

      Sub

      求两个时间之间的差值:

      func (t Time) Sub(u Time) Duration

      返回一个时间段t-u。如果结果超出了Duration可以表示的最大值/最小值,将返回最大值/最小值。要获取时间点t-d(d为Duration),可以使用t.Add(-d)。

      func main() {
        now := time.Now()
        fmt.Println(now)
      	
        targetTime := now.Add(time.Hour)
        // 目标时间与此时相比相差1h0m0s
        fmt.Println(targetTime.Sub(now)) //1h0m0s
      	
        before := now.Add(time.Hour*-1) // 当前时间减1小时后的时间
        fmt.Println(before)
      }

      Equal

      func (t Time) Equal(u Time) bool

      判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。和用 t==u 不同的是,这种方法还会比较地点和时区信息。

      Before

      func (t Time) Before(u Time) bool

      如果t代表的时间点在u之前,返回真;否则返回假。

      After

      func (t Time) After(u Time) bool

      如果 t 代表的时间点在 u 之后,返回真;否则返回假。

      定时器

      使用time.Tick(时间间隔)来设置定时器。

      func main() {
        ticker := time.Tick(time.Second) //定义一个1秒间隔的定时器
        for i := range ticker {
          fmt.Println(i)//每秒都会执行的任务
        }
      }

      时间格式化

      时间类型有一个自带的方法Format进行格式化,需要注意的是 Go 语言中格式化时间模板不是常见的Y-m-d H:M:S而是使用 Go 的诞生时间2006年1月2号15点04分(记忆口诀为2006 1 2 3 4)。

      func main() {
          now := time.Now()
          // 格式化的模板为Go的出生时间2006年1月2号15点04分 Mon Jan
          // 24小时制
          fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))
          // 12小时制
          fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan"))
          fmt.Println(now.Format("2006/01/02 15:04"))
          fmt.Println(now.Format("15:04 2006/01/02"))
          fmt.Println(now.Format("2006/01/02"))
      }

      解析字符串格式的时间

      now := time.Now()
      fmt.Println(now)
      // 加载时区
      loc, err := time.LoadLocation("Asia/Shanghai")
      if err != nil {
          fmt.Println(err)
          return
      }
      // 按照指定时区和指定格式解析字符串时间
      timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2021/12/27 18:48:44", loc)
      if err != nil {
          fmt.Println(err)
          return
      }
      fmt.Println(timeObj)
      fmt.Println(timeObj.Sub(now))

      总结

      到此这篇关于Go语言标准库Time的文章就介绍到这了,更多相关Go语言标准库Time内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜