十一、time标准包
time包提供了时间的显示和测量用的函数。8历的计算采用的是公历。
11.1、时间类型
time.Time类型表示时间。我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息。示例代码如下:
func main() {
now := time.Now() //获取系统时间
fmt.Println("现在的时间是:", now)
//现在的时间是: 2021-08-04 18:02:52.864717 +0800 CST m=+0.002099601
year := now.Year()
month := now.Month()
day := now.Day()
hour := now.Hour()
minute := now.Minute()
second := now.Second()
fmt.Printf("现在是:%d年%d月%d日%d时%d分%d秒", year, month, day, hour, minute, second)
//现在是:2021年8月4日18时5分26秒
}
11.2、时间戳
使用time.Unix()函数可以将时间战转为时间格式。
func main() {
now := time.Now() //获取系统时间
fmt.Println("现在的时间是:", now)
//现在的时间是: 2021-08-04 18:14:22.4631104 +0800 CST m=+0.002645001
fmt.Println(now.Unix()) //时间戳 1628072062 秒
fmt.Println(now.UnixNano()) //时间戳 1628072062463110400 纳秒
now2 := time.Unix(now.Unix(), 0)
fmt.Println(now2) //2021-08-04 18:14:22 +0800 CST
}
11.3、时间间隔
Duration类型代表两个时间点之间经过的时间,以纳秒为单位。可表示的最长时间段大约290年。
例如:time.Duration表示1纳秒,time.Second表示1秒。
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
}
11.4、时间操作
11.4.1、添加Add
日常的编码过程中可能会遇到要求时间+时间间隔的需求,Go语言的时间对象有提供Add方法。
func main() {
now := time.Now() //获取系统时间
fmt.Println("现在的时间是:", now)
//现在的时间是: 2021-08-04 18:25:46.0697561 +0800 CST m=+0.002079701
next := now.Add(time.**Hour** * 2)
fmt.Println("两个小时后的时间是:",next)
//两个小时后的时间是: 2021-08-04 20:25:46.0697561 +0800 CST m=+7200.002079701
}
14.4.2、时间差值Sub
func (t Time) Sub(u Time) Duration {
}
求两个时间之间的差值,返回一个时间段t-u。如果结果超出了Duration可以表示的最大值/最小值,将返回最大值/最小值。要获取时间点t-d (d为Duration),可以使用t,Add(-d)。
func main() {
parse, err := time.Parse("2006-01-02 15:04:05.000", "2021-08-04 18:52:17.723")
if err == nil {
r := time.Now().UTC()
fmt.Println(r)//2021-08-04 11:29:17.9214356 +0000 UTC
fmt.Println(parse)//2021-08-04 18:52:17.723 +0000 UTC
parse = parse.UTC()
duration := r.Sub(parse)
fmt.Println(duration)//-7h22m59.8015644s
}else {
fmt.Println("时间转换错误:",err)//2021-08-04 18:52:17.723 +0000 UTC
}
}
14.4.3、时间是否相等Equal
func (t Time) Equal(u Time) bool
判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。本方法和用t==u不同,这种方法还会比较地点和时区信息,
14.4.4、时间是否在前Before
func (t Time) Before(u Time) bool
如果t代表的时间点在u之前,返回真;否则返回假。
14.4.5、时间是否在后After
func (t Time) After(u Time) bool
如果t代表的时间点在u之后,返回真;否则返回假。
14.4.6、定时器
使用time.Tick(时间间隔)来设置定时器,定时器的本质上是一个通道(channel)
func main() {
ticker := time.Tick(time.**Second**) //定义一个1秒 间隔的定时器
for i := range ticker {
fmt.Println(i) //每秒都会执行的任务
}
}
14.4.7、时间格式化
时间类型有一个自带的方法Format 进行格式化,需要注意的是Go语言中格式化时间模板不是常见的Y-m-d H:M:S而是使用Go的诞生时间2006年1月2号15点04分05.000秒(记忆口诀为200612345)。如果想格式化为12小时方式,需指定PM
func main() {
now := time.Now()
//格式化的模板为 Go的出生时间2086年1月2号15点04分05秒 Mon Jan
fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan")) //24小时制 2021-08-04 18:44:36.413 Wed Aug
fmt.Println(now.Format("2006-01-02 03:04:05.000 Mon Jan")) //12小时制 2021-08-04 06:44:36.413 Wed Aug
fmt.Println(now.Format("2006年01月02日 15时04分05.000秒 Mon Jan")) //2021年08月04日 18时44分36.413秒 Wed Aug
fmt.Println(now.Format("2006/01/02")) //2021/08/04
fmt.Println(now.Format("03:04:05.000")) //06:44:36.413
fmt.Println(now.Format("2006-01-02 03:04:05.000")) //2021-08-04 06:44:36.413
}
14.4.8、把字符串转换成时间戳
func main() {
parse, err := time.Parse("2006-01-02 15:04:05.000", "2021-08-04 18:52:17.723")
if err == nil {
fmt.Println(parse)
}else {
fmt.Println("时间转换错误:",err)//2021-08-04 18:52:17.723 +0000 UTC
}
}
14.5、sleep()
func main() {
time.Sleep(1000)
fmt.Println("hello")
n := 1000
time.Sleep(time.Duration(n))
fmt.Println("world")
}
14.6、时区相关
func main() {
now := time.Now() //本地的时间
fmt.Println(now)//2021-08-04 19:54:21.8713356 +0800 CST m=+0.002121301
//明天的这个时间
//按照指定格式取解析一个字符串格式的时间
parse, err2 := time.Parse("2006-01-02 15:04:05", "2021-08-04 14:41:50")
if err2 == nil {
fmt.Println("解析时间是:", parse)//解析时间是: 2021-08-04 14:41:50 +0000 UTC
} else {
fmt.Println("时间解析失败:",err2)
}
//按照东八区的时区和格式取解析一个字符串格式的时间
//根据字符串加载时区
loc, err := time.LoadLocation("Asia/Shanghai")
if err == nil {
fmt.Println("本地时区是:", loc)//本地时区是: Asia/Shanghai
} else {
fmt.Println("时区转换失败:",err)
}
parse, err2 = time.ParseInLocation("2006-01-02 15:04:05", "2019-08-04 14:41:50", loc)
if err2 == nil {
fmt.Println("解析本地时间是:", parse)//解析本地时间是: 2019-08-04 14:41:50 +0800 CST
} else {
fmt.Println("本地时间解析失败:",err2)
}
}