您所在的位置:首页 / 知识分享

GO中关于时间 Time

2020.09.09

44

go中时间可分为时间点(Time)与时间段(Duration),时间的操作应用主要在于time 包的使用。

时间点(Time)

go 针对不同的参数类型提供了以下初始化的方式

//当前时间
fmt.Println(time.Now())

//使用parse 格式为标准时间
time.Parse("2016-01-02 15:04:05", "2018-04-23 12:24:51")

// layout已带时区时可直接用Parse)
time.ParseInLocation("2006-01-02 15:04:05", "2017-05-11 14:06:06", time.Local)

//时间戳
time.Unix(1e9, 0)

//
time.Date(2018, 1, 2, 15, 30, 10, 0, time.Local)

//ime 当前时间对应指定时区的时间
loc, _ := time.LoadLocation("America/Los_Angeles")
fmt.Println(time.Now().In(loc))


获取到时间点之后,需要转换成我们需要的格式,也就是格式化:

格式化为字符串
格式化为字符串我们需要使用 time.Format 方法来转换成我们想要的格式

fmt.Println(time.Now().Format("2006-01-02 15:04:05"))  
fmt.Println(time.Now().Format(time.UnixDate))         

Format 函数中可以指定你想使用的格式,同时 time 包中也给了一些我们常用的格式

const (
    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 with numeric zone
    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 with numeric zone
    RFC3339     = "2006-01-02T15:04:05Z07:00"
    RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
    Kitchen     = "3:04PM"
    // Handy time stamps.
    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"
)    

需要注意的是:galang 中指定的特定时间格式为 "2006-01-02 15:04:05 -0700 MST"

时间戳
func (t Time) Unix() int64
func (t Time) UnixNano() int64

fmt.Println(time.Now().Unix())

// 获取指定日期的时间戳
dt, _ := time.Parse("2016-01-02 15:04:05", "2018-04-23 12:24:51")
fmt.Println(dt.Unix())

fmt.Println(time.Date(2018, 1,2,15,30,10,0, time.Local).Unix())



时间运算
// func Sleep(d Duration)   休眠多少时间,休眠时处于阻塞状态,后续程序无法执行
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与当前时间的间隔

// func (t Time) Add(d Duration) Time
fmt.Println(dt.Add(time.Duration(10) * time.Second))   // 加

func (t Time) Sub(u Time) Duration                    // 减 

// func (t Time) AddDate(years int, months int, days int) Time
fmt.Println(dt.AddDate(1, 1, 1))

// func (t Time) Before(u Time) bool
// func (t Time) After(u Time) bool
// func (t Time) Equal(u Time) bool          比较时间点时尽量使用Equal函数 


时区转换
      // time.Local 用来表示当前服务器时区
      // 自定义地区时间
      secondsEastOfUTC := int((8 * time.Hour).Seconds())
      beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)
      fmt.Println(time.Date(2018,1,2,0,0,0,0, beijing))  // 2018-01-02 00:00:00 +0800 Beijing Time  

      // 当前时间转为指定时区时间
      fmt.Println(time.Now().In(beijing))

      // 指定时间转换成指定时区对应的时间
      dt, err := time.ParseInLocation("2006-01-02 15:04:05", "2017-05-11 14:06:06", time.Local)

      // 当前时间在零时区年月日   时分秒  时区
      year, mon, day := time.Now().UTC().Date()     // 2018 April 24 
      hour, min, sec := time.Now().UTC().Clock()    // 3 47 15

      zone, _ := time.Now().UTC().Zone()            // UTC

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

      // 无法取消
      tick := time.Tick(1 * time.Minute)
      for _ = range tick {
            // do something
      }

      // 可通过调用ticker.Stop取消
      ticker := time.NewTicker(1 * time.Minute)
      for _ = range tick {
            // do something
      }


参考:https://blog.csdn.net/wschq/article/details/80114036