go time包的运用

日期: 2019-12-06 15:39 浏览次数 :

在我们编程过程中,经常会用到与时间相关的各种务需求,下面来介绍 golang 中有关时间的一些基本用法,我们从 time 的几种 type 来开始介绍。

time.Time{}

时间类型,包含了秒和纳秒以及Location

wall uint64//秒ext int64//纳秒loc *Location

先了解下time类型:

时间可分为时间点与时间段, golang 也不例外,提供了以下两种基础类型

time.Month()

type Month int

月份.定义了十二个月的常量

type Time struct {

  1. 时间点(Time)
  2. 时间段(Duration)

Weekday

type Weekday int 周,定义了一周的七天

// sec gives the number of seconds elapsed since

除此之外 golang 也提供 了以下类型,做一些特定的业务

Duration

time.Duration()

持续时间.定义了以下持续时间类型.多用于时间的加减 需要传入Duration做为参数的时候

const ( Nanosecond Duration = 1 Microsecond = 1000 * Nanosecond Millisecond = 1000 * Microsecond Second = 1000 * Millisecond Minute = 60 * Second Hour = 60 * Minute)

// January 1, year 1 00:00:00 UTC.

  1. 时区(Location)
  2. Ticker
  3. Timer(定时器)

Location

在time包里有两个时区变量:

time.UTC utc时间time.Local 本地时间FixedZone(name string, offset int) *Location设置时区名,以及与UTC0的时间偏差.返回Location

sec int64

我们将按以上顺序来介绍 time 包的使用。

Timer

定时器只会传达一次到期事件,

type Timer struct { C <-chan Time r runtimeTimer}

// nsec specifies a non-negative nanosecond

时间点(Time)

Ticker

周期性的传达到期事件的装置,

定时器只会传达一次到期事件,断续器会持续工作直到停止

type Ticker struct { C <-chan Time // The channel on which the ticks are delivered. r runtimeTimer}

// offset within the second named by Seconds.

我们使用的所有与时间相关的业务都是基于点而延伸的,两点组成一个时间段,大多数应用也都是围绕这些点与面去做逻辑处理。

time.Now()

获取当前时间,返回Time类型

// It must be in the range [0, 999999999].

初始化

func Sleep(d Duration)

表示睡多少时间,睡觉时,是阻塞状态

nsec int32

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

Since Duration

返回与当前时间的时间差

// loc specifies the Location that should be used to

// func Now() Time
 fmt.Println(time.Now())

 // func Parse(layout, value string) (Time, error)
 time.Parse("2016-01-02 15:04:05", "2018-04-23 12:24:51")

 // func ParseInLocation(layout, value string, loc *Location) (Time, error) (layout已带时区时可直接用Parse)
 time.ParseInLocation("2006-01-02 15:04:05", "2017-05-11 14:06:06", time.Local)

 // func Unix(sec int64, nsec int64) Time
 time.Unix(1e9, 0)

 // func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time
 time.Date(2018, 1, 2, 15, 30, 10, 0, time.Local)

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

 // func (t Time) Local() Time

Unix(sec int64, nsec int64) Time

根据秒数和纳秒,返回Time类型

(若只有秒或者毫秒,另一个参数为零)

// determine the minute, hour, month, day, and year

获取到时间点之后为了满足业务和设计,需要转换成我们需要的格式,也就是所谓的时间格式化。

func Until Duration

计算t到当前的时间差.返回类型Duration

// that correspond to this Time.

格式化

func After(d Duration) <-chan Time

返回一个time.C这个管道,d后会在此管道中放入一个时间点(time.Now

// Only the zero Time has a nil Location.

to string

func AfterFunc(d Duration, f func *Timer

将一个间隔和一个函数给AfterFunc后,间隔时间过后,执行传入的函数

// In that case it is interpreted to mean UTC.

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

func NewTimer(d Duration) *Timer

新的定时创建一个新的定时器,将当前时间的通道后至少持续时间D.

loc *Location

fmt.Println(time.Now().Format("2006-01-02 15:04:05")) // 2018-04-24 10:11:20
 fmt.Println(time.Now().Format(time.UnixDate))  // Tue Apr 24 09:59:02 CST 2018

func Parse(layout, value string) (Time, error)

将字符窜转换为Time类型.

layout := ""2006-01-02 15:04:05.999999""t, _ := time.Parse(layout, "2013-10-05 18:30:50")fmt.Println// 当前时区时间格式化转换strTime := "2018-03-24T20:01:00+08:00"tim, _:=time.ParseInLocation("2006-01-02T15:04:05+08:00", strTime, time.Local)

}

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

func ParseDuration (Duration, error)

将字duration符窜("ns", "us" , "ms", "s", "m", "h".)转换为Duration类型.就是纳秒

t, _ := time.ParseDurationfmt.Println(t.Seconds

对于time.Time类型,我们可以通过使用函数Before,After,Equal来比较两个time.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"
)

func ParseInLocation(layout, value string, loc *Location) (Time, error)

parseinlocation像解析,但在两个重要方面不同。首先,在时区信息的情况下,分析解释时间UTC;parseinlocation解释时间在给定的位置。其次,当给定一个带偏移或缩写,解析试图匹配与局部的位置;parseinlocation使用给定的位置。

t1 := time.Now()

注意: galang 中指定的 特定时间格式 为 "2006-01-02 15:04:05 -0700 MST" , 为了记忆方便,按照美式时间格式 月日时分秒年 外加时区 排列起来依次 是 01/02 03:04:05PM ‘06 -0700 ,刚开始使用时需要注意。

func NewTicker(d Duration) *Ticker

创建一个新的Ticker

t2 := t1.Add(-1 * time.Minute)

to time stamp

func Tick(d Duration) <-chan Time

返回一个time.C这个管道,d后会在此管道中放入一个时间点(time.Now

fmt.Println(t1.Before