首页 > Go学习 > Go语言的time包
2021
09-10

Go语言的time包

Location结构类型

type Location struct {  // 内含隐藏或非导出字段  }
代表一个地点以及该地点所在的时区

两个与预定义变量
var Local *Location = &localLoc
//代表系统本地,对应本地时区
var UTC *Location = &utcLoc
//代表通用协调,对应零时区

LoadLocation(name string) (*Location, error):
    返回使用给定的名字创建的Location
    name应该是IANA时区数据库里有记录的地点名,如"America/New_York"
    name是空("")或"UTC",返回UTC
    name是"Local",返回Local

Time结构类型

type Time struct {  // 内含隐藏或非导出字段  }
代表一个纳秒精度的时间点
Time零值代表时间点"January 1, year 1, 00:00:00.000000000 UTC"

获取Time:

Now() Time :返回本地当前时间
Unix(sec int64, nsec int64) Time :根据一个时间戳返回UTC时间

Parse(layout, value string) (Time, error):
    以layout指定的格式解析字符串value表示的时间并返回
    如果layout中缺少时区信息时,将时间解释为UTC时间
ParseInLocation(layout, value string, loc *Location) (Time, error):
    作用同Parse函数
    不同的是如果layout中缺少时区信息时,将时间解释为loc指定时间

Time的格式化:

(t Time) Format(layout string) string :
    根据layout指定的格式返回t代表的时间点的格式化文本

自定义时间格式layout参数

在Go中有意思的是当表示时间自定义格式的时候并不是使用其他语言类似Y表示年、m表示月等字符这种格式,而是指定了一个固定的参考时间,以指定格式书写这个固定的参考时间就会解析成指定的时间,这个指定的时间是"2006-01-02 15:04:05.999999999 -0700 MST"(这个时间是GO语言的诞生时间)

其中2006就表示年,01表示月,以此类推
秒数后面的".999999999"中9个数量表示精确度,最多9位
-0700表示时区
Time.Now().Format("2006-01-02 15:04:05")会格式化当前时间为:
    2021-09-10 22:50:11

Time的操作

(t Time) Location() *Location:返回t的地点和时区信息
(t Time) Zone() (name string, offset int) :
    返回t所在时区的规范名(如"CET")和该时区相对于UTC的时间偏移量(单位秒)
(t Time) IsZero() bool :t是否代表Time零值的时间
(t Time) Local() Time :将t表示的时区转换为本地时区的时间
(t Time) UTC() Time :将t表示的时区转换为UTC时区(零时区)的时间
(t Time) In(loc *Location) Time :将t表示的时区转换为指定地区的时间
(t Time) Unix() int64 :返回时间戳(单位秒)
(t Time) UnixNano() int64 :返回时间戳(单位纳秒)
    如果结果超出了int64能表示的范围,结果是未定义的(Time零值的时间戳)
(t Time) Equal(u Time) bool :判断两个时间是否相同,会考虑时区的影响
(t Time) Before(u Time) bool :t代表的时间点是否在u之前
(t Time) After(u Time) bool :t代表的时间点是否在u之后
(t Time) Date() (year int, month Month, day int) :返回对应的年、月、日
(t Time) Clock() (hour, min, sec int) :返回对应的时、分、秒
(t Time) Year() int :返回对应的年份
(t Time) Month() Month :返回对应的月份
(t Time) ISOWeek() (year, week int) :返回ISO 9601标准下的年份和一年中的第几周
(t Time) YearDay() int :返回一年中的第几天
(t Time) Day() int :返回一月中的第几天
(t Time) Weekday() Weekday :返回一周中的第几天,0表示周日
(t Time) Hour() int :返回小时数
(t Time) Minute() int :返回分钟数
(t Time) Second() int : 返回秒数
(t Time) Nanosecond() int :返回纳秒数,最多9位
(t Time) AddDate(years int, months int, days int) Time :
    返回增加了给出的年份、月份和天数的时间点Time
    可以为负值
(t Time) String() string :返回格式化时间
    采用"2006-01-02 15:04:05.999999999 -0700 MST"格式

(t Time) Add(d Duration) Time :返回t+d的时间
(t Time) Sub(u Time) Duration :返回一个时间段t-u。如果结果超出了Duration可以表示的最大值/最小值,将返回最大值/最小值
(t Time) Round(d Duration) Time :返回距离t最近的时间点
    该时间点应该满足从Time零值到该时间点的时间段能整除d;
    如果有两个满足要求的时间点,距离t相同,会向上舍入;
    如果d <= 0,会返回t的拷贝。
(t Time) Truncate(d Duration) Time :类似Round,但是返回的是最接近但早于t的时间点;如果d <= 0,会返回t的拷贝

时间段类型Duration

type Duration int64

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

const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
)
已经预定了常用的时间段常量

Sleep(d Duration):
    Sleep阻塞当前go程序至少d代表的时间段

ParseDuration(s string) (Duration, error) :
    解析一个时间段字符串
    如"300ms"、"-1.5h"、"2h45m"
    合法的单位有"ns"、"us" "µs"、"ms"、"s"、"m"、"h"
Since(t Time) Duration :返回从t到现在经过的时间
    等价于time.Now().Sub(t)
(d Duration) Hours() float64 :将时间段表示为float64类型的小时数
(d Duration) Minutes() float64 :将时间段表示为float64类型的分钟数
(d Duration) Seconds() float64 :将时间段表示为float64类型的秒数
(d Duration) Nanoseconds() int64 :将时间段表示为int64类型的纳秒数,等价于int64(d)
(d Duration) String() string :返回时间段采用"72h3m0.5s"格式的字符串表示

Timer类型

type Timer struct {
    C <-chan Time
    // 内含隐藏或非导出字段
}
Timer类型代表单次时间事件。当Timer到期时,当时的时间会被发送给C,除非Timer是被AfterFunc函数创建的

NewTimer(d Duration) *Timer :创建一个Timer
    它会在最少过去时间段d后到期
    然后向其自身的C字段发送当时的时间
AfterFunc(d Duration, f func()) *Timer :
    另起一个go协程等待时间段d过去,然后调用f函数
    返回一个Timer,可以通过调用其Stop方法来取消等待和对f的调用
After(d Duration) <-chan Time :
    会在另一线程经过时间段d后向返回值发送当时的时间
    等价于NewTimer(d).C
(t *Timer) Reset(d Duration) bool :
    使t重新开始计时
    本方法返回后再等待时间段d过去后到期
    如果调用时t还在等待中会返回真
    如果t已经到期或者被停止了会返回假
(t *Timer) Stop() bool :停止Timer的执行
    如果停止了t会返回真
    如果t已经被停止或者过期了会返回假
    不会关闭通道t.C,以避免从该通道的读取不正确的成功

Ticker类型

type Ticker struct {
    C <-chan Time // 周期性传递时间信息的通道
    // 内含隐藏或非导出字段
}
Ticker保管一个通道,并每隔一段时间向其传递当前时间

NewTicker(d Duration) *Ticker :返回一个新的Ticker
    每隔时间段d就向该Ticker包含的通道发送当时的时间
    它会调整时间间隔或者丢弃传递的信息以适应反应慢的接收者
(t *Ticker) Stop() :关闭一个Ticker
    在关闭后,将不会在发送信息
    不会关闭通道t.C,以避免从该通道的读取不正确的成功
Tick(d Duration) <-chan Time :
    Tick是NewTicker的封装
    只提供对Ticker的通道的访问
    如果不需要关闭Ticker,本函数就很方便
最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。