Go 常用标准库之time

2023-07-11 19:56:40 阅读:773 评论:0 点赞:0

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

相关常量

const (
	Layout      = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order.
	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"
	// 方便的时间戳
	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"
	// 这几个是后面版本才有的
	DateTime   = "2006-01-02 15:04:05"
	DateOnly   = "2006-01-02"
	TimeOnly   = "15:04:05"
)

这些预定义的版式用于 Time.FormatTime.Parse 函数

type Weekday int 代表一周的某一天。

const (
	Sunday Weekday = iota
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Saturday
)

type Month int 代表一年的某个月。

const (
    January Month = 1 + iota
    February
    March
    April
    May
    June
    July
    August
    September
    October
    November
    December
)

例如:

_, month, day := time.Now().Date()
fmt.Println(month, day)

type Location 代表一个(关联到某个时间点的)地点,以及该地点所在的时区。

type Location struct {
    // 内含隐藏或非导出字段
}

var Local *Location = &localLoc
// Local代表系统本地,对应本地时区。

var UTC *Location = &utcLoc
// UTC代表通用协调时间,对应零时区。

func LoadLocation(name string) (*Location, error)
// LoadLocation返回使用给定的名字创建的Location。
// 如果name是""或"UTC",返回UTC;如果name是"Local",返回Local;
// 否则name应该是IANA时区数据库里有记录的地点名(该数据库记录了地点和对应的时区)
// 例如:"America/New_York"。
// LoadLocation函数需要的时区数据库可能不是所有系统都提供,特别是非Unix系统。
// 此时LoadLocation会查找环境变量ZONEINFO指定目录或解压该变量指定的zip文件(如果有该环境变量);
// 然后查找Unix系统的惯例时区数据安装位置,最后查找$GOROOT/lib/time/zoneinfo.zip。

func FixedZone(name string, offset int) *Location
// 使用给定的地点名name和时间偏移量offset(单位秒)创建并返回一个Location

func (l *Location) String() string
// 返回对时区信息的描述,返回值绑定为LoadLocation或FixedZone函数创建l时的name参数。

type Duration 代表两个时间点之间经过的时间,以纳秒为单位。可表示的最长时间段大约290年。

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

提示

常用的时间段。没有定义一天或超过一天的单元,以避免夏时制的时区切换的混乱。

要将Duration类型值表示为某时间单元的个数,用除法:

second := time.Second
fmt.Print(int64(second/time.Millisecond)) // prints 1000
// 相反
seconds := 10
fmt.Print(time.Duration(seconds)*time.Second) // prints 10s

Time 相关函数

type Time struct {
    // 内含隐藏或非导出字段
}

func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time
// 返回一个时区为loc、当地时间的时间点。

func Now() Time
// 返回当前本地时间。

func Parse(layout, value string) (Time, error)
// 解析一个格式化的时间字符串并返回它代表的时间。

func ParseInLocation(layout, value string, loc *Location) (Time, error)
// 按指定时区解析一个格式化的时间字符串并返回它代表的时间。

func Unix(sec int64, nsec int64) Time
// 创建一个本地时间,对应sec和nsec表示的Unix时间(从January 1, 1970 UTC至该时间的秒数和纳秒数)。
// 提示:nsec的值在[0, 999999999]范围外是合法的。

func (t Time) Location() *Location
// 返回t的地点和时区信息。

func (t Time) Zone() (name string, offset
// 计算t所在的时区,返回该时区的规范名(如"CET")和该时区相对于UTC的时间偏移量(单位秒)。

func (t Time) IsZero() bool
// 报告t是否代表Time零值的时间点,January 1, year 1, 00:00:00 UTC。

func (t Time) Local() Time
// 返回采用本地和本地时区,但指向同一时间点的Time。

func (t Time) UTC() Time
// 返回采用UTC和零时区,但指向同一时间点的Time。

func (t Time) In(loc *Location) Time
// 返回采用loc指定的地点和时区,但指向同一时间点的Time。如果loc为nil会panic。

func (t Time) Unix() int64
// 将t表示为Unix时间,即从时间点January 1, 1970 UTC到时间点t所经过的时间(单位秒)。

func (t Time) UnixNano() int64
// 将t表示为Unix时间,即从时间点January 1, 1970 UTC到时间点t所经过的时间(单位纳秒)。
// 如果纳秒为单位的unix时间超出了int64能表示的范围,结果是未定义的。
// 注意这就意味着Time零值调用UnixNano方法的话,结果是未定义的。

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

func (t Time) Before(u Time) bool
// 如果t代表的时间点在u之前返回真,否则返回假。

func (t Time) After(u Time) bool
// 如果t代表的时间点在u之后返回真,否则返回假。

func (t Time) Date() (year int, month Month, day int)
// 返回时间点t对应的年、月、日。

func (t Time) Clock() (hour, min, sec int)
// 返回t对应的那一天的时、分、秒。

func (t Time) Year() int
// 返回时间点t对应的年份。

func (t Time) Month() Month
// 返回时间点t对应那一年的第几月。

func (t Time) ISOWeek() (year, week int)
// 返回时间点t对应的ISO 9601标准下的年份和星期编号。
// 星期编号范围[1,53],1月1号到1月3号可能属于上一年的最后一周,12月29号到12月31号可能属于下一年的第一周。

func (t Time) YearDay() int
// 返回时间点t对应的那一年的第几天,平年的返回值范围[1,365],闰年[1,366]。

func (t Time) Day() int
// 返回时间点t对应那一月的第几日。

func (t Time) Weekday() Weekday
// 返回时间点t对应的那一周的周几。

func (t Time) Hour() int
// 返回t对应的那一天的第几小时,范围[0, 23]。

func (t Time) Minute() int
// 返回t对应的那一小时的第几分种,范围[0, 59]。

func (t Time) Second() int
// 返回t对应的那一分钟的第几秒,范围[0, 59]。

func (t Time) Nanosecond() int
// 返回t对应的那一秒内的纳秒偏移量,范围[0, 999999999]。

func (t Time) Add(d Duration) Time
// Add返回时间点t±d。

func (t Time) AddDate(years int, months int, days int) Time
// AddDate返回增加了给出的年份、月份和天数的时间点Time。
// 例如,时间点January 1, 2011调用AddDate(-1, 2, 3)会返回March 4, 2010。
// AddDate会将结果规范化,类似Date函数的做法。
// 例如,给时间点October 31添加一个月,会生成时间点December 1。(从时间点November 31规范化而来)

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

func (t Time) Round(d Duration) Time
// 返回距离t最近的时间点,该时间点应该满足从Time零值到该时间点的时间段能整除d;
// 如果有两个满足要求的时间点,距离t相同,会向上舍入;如果d <= 0,会返回t的拷贝。

func (t Time) Truncate(d Duration) Time
// 类似Round,但是返回的是最接近但早于t的时间点;如果d <= 0,会返回t的拷贝。

func (t Time) Format(layout string) string
// Format根据layout指定的格式返回t代表的时间点的格式化文本表示。
// layout定义了参考时间:Mon Jan 2 15:04:05 -0700 MST 2006

func (t Time) String() string
// 返回采用如下格式字符串的格式化时间。
// "2006-01-02 15:04:05.999999999 -0700 MST"

func (t Time) GobEncode() ([]byte, error)
// GobEncode实现了gob.GobEncoder接口。

func (t *Time) GobDecode(data []byte) error
// GobEncode实现了gob.GobDecoder接口。

func (t Time) MarshalBinary() ([]byte, error)
// MarshalBinary实现了encoding.BinaryMarshaler接口。

func (t *Time) UnmarshalBinary(data []byte) error
// UnmarshalBinary实现了encoding.BinaryUnmarshaler接口。

func (t Time) MarshalJSON() ([]byte, error)
// MarshalJSON实现了json.Marshaler接口。
// 返回值是用双引号括起来的采用RFC 3339格式进行格式化的时间表示,如果需要会提供小于秒的精度。
// RFC 3339:http://tools.ietf.org/html/rfc3339
// 例如:"2023-07-11T20:44:00.4579164+08:00"

func (t *Time) UnmarshalJSON(data []byte) (err error)
// UnmarshalJSON实现了json.Unmarshaler接口。时间被期望是双引号括起来的RFC 3339格式。

func (t Time) MarshalText() ([]byte, error)
// MarshalText实现了encoding.TextMarshaler接口。
// 返回值是采用RFC 3339格式进行格式化的时间表示,如果需要会提供小于秒的精度。

func (t *Time) UnmarshalText(data []byte) (err error)
// UnmarshalText实现了encoding.TextUnmarshaler接口。时间被期望采用RFC 3339格式。

func Since(t Time) Duration
// 返回从t到现在经过的时间,等价于time.Now().Sub(t)。

func Sleep(d Duration)
// 阻塞当前go程至少d代表的时间段。d<=0时,Sleep会立刻返回。

func After(d Duration) <-chan Time
// 会在另一线程经过时间段d后向返回值发送当时的时间。等价于NewTimer(d).C。

func Tick(d Duration) <-chan Time
// Tick是NewTicker的封装,只提供对Ticker的通道的访问。如果不需要关闭Ticker,本函数就很方便。

Duration 相关函数

type Duration int64

func ParseDuration(s string) (Duration, error)
// 解析一个时间段字符串。一个时间段字符串是一个序列,每个片段包含可选的正负号、十进制数、可选的小数部分和单位后缀,
// 如"300ms"、"-1.5h"、"2h45m"。
// 合法的单位有:"ns"、"us" /"µs"、"ms"、"s"、"m"、"h"。

func (d Duration) Hours() float64
// 将时间段表示为float64类型的小时数。

func (d Duration) Minutes() float64
// 将时间段表示为float64类型的分钟数。

func (d Duration) Seconds() float64
// 将时间段表示为float64类型的秒数。

func (d Duration) Nanoseconds() int64
// 将时间段表示为int64类型的纳秒数,等价于int64(d)。

func (d Duration) String() string
// 返回时间段采用"72h3m0.5s"格式的字符串表示。
// 最前面可以有符号,数字+单位为一个单元,开始部分的0值单元会被省略;
// 如果时间段<1s,会使用"ms"、"us"、"ns"来保证第一个单元的数字不是0;如果时间段为0,会返回"0"。

Timer

Timer 类型代表单次时间事件。当 Timer 到期时,当时的时间会被发送给 C,除非 Timer 是被 AfterFunc 函数创建的。

type Timer struct {
    C <-chan Time
    // 内含隐藏或非导出字段
}

func NewTimer(d Duration) *Timer
// 创建一个Timer,它会在最少过去时间段d后到期,向其自身的C字段发送当时的时间。

func AfterFunc(d Duration, f func()) *Timer
// 另起一个go程等待时间段d过去,然后调用f。它返回一个Timer,可以通过调用其 Stop 方法来取消等待和对f的调用。

func (t *Timer) Reset(d Duration) bool
// Reset使t重新开始计时,(本方法返回后再)等待时间段d过去后到期。
// 如果调用时t还在等待中会返回真;如果t已经到期或者被停止了会返回假。

func (t *Timer) Stop() bool
// Stop停止Timer的执行。如果停止了t会返回真;
// 如果t已经被停止或者过期了会返回假。
// 注意:Stop 不会关闭通道t.C,以避免从该通道的读取不正确的成功。

Ticker

Ticker 保管一个通道,并每隔一段时间向其传递 tick

type Ticker struct {
    C <-chan Time // 周期性传递时间信息的通道
    // 内含隐藏或非导出字段
}

func NewTicker(d Duration) *Ticker
// 返回一个新的Ticker,该Ticker包含一个通道字段,并会每隔时间段d就向该通道发送当时的时间。
// 它会调整时间间隔或者丢弃tick信息以适应反应慢的接收者。如果d<=0会panic。
// 关闭该Ticker可以释放相关资源。

func (t *Ticker) Stop()
// 关闭一个Ticker。在关闭后,将不会发送更多的tick信息。
// 注意:Stop不会关闭通道t.C,以避免从该通道的读取不正确的成功。

func (t *Ticker) Reset(d Duration)
// 修改Ticker执行间隔
标签: go time

永不言弃

职业:后端开发工程师
学校:重庆师范大学
城市:重庆
文章:169
好吧,不知道说点什么...

登录逐梦笔记

注册逐梦笔记

已有账号?