golang 标准库time

Time标准库

golang 时间显示和格式化等等操作主要是使用time包,日历的计算采用的是公历时间。

标准库用法

1
2
3
4
Now()
Unix()
Date()
UnixNano()

1.显示当前时间,返回的是Time类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"fmt"
"time"
)


func main(){

now := time.Now() //时间对象
fmt.Println(now)

}

输出结果为

1
2020-05-15 14:55:29.0136499 +0800 CST m=+0.004986301

2.通过Time对象获取当前时间的年、月、日 小时、分钟等

1
2
3
4
5
6
7
now := time.Now() //时间对象
year := now.Year() //年
month := now.Month() //月
day := now.Day() //日
hour := now.Hour() //小时
minute := now.Minute() //分钟
second := now.Second() //秒

3.Sleep沉睡

1
time.Sleep(time.Second * 1)  //沉睡1秒

时间戳

1.获取当前的时间戳,从1970 01 01到现在的时间的秒数

1
2
3
4
timeStamp1 := now.Unix()
timeStamp2 := now.UnixNano()
fmt.Println(timeStamp1) //当前世间戳
fmt.Println(timeStamp2) //当前世间戳微秒,纳秒

输出时间戳

1
2
1589526157
1589526157438067900

2.通过时间戳转成Time时间格式

1
2
3
t:=time.Unix(1589514825,0) //0纳秒
fmt.Println(t)
fmt.Printf("%v年%v月%v日\n",t.Year(),t.Month(),t.Day())

输出

1
2
2020-05-15 11:53:45 +0800 CST
2020年May月15

定时器

定时器使用time.Tick()方法,可以用于写循环执行的定时任务。当使用Tick()时会返回一个channel。

1
2
3
4
5
6
7

for tmp := range time.Tick(time.Second * 3){

//do something
fmt.Println(tmp) //每隔3秒打印当前时间

}

参考实例

1
2
3
4
5
6
7
8
9
10

tmp:= time.Tick(time.Second * 3)

for{

select {
case <-tmp:
fmt.Println("执行任务")
}
}

获取之后或者之前的时间

1.获取未来5小时的时间

1
2
currentTime := time.Now()
newTime := currentTime.Add(time.Hour * 5)
  1. 获取昨日时间
1
2
currentTime := time.Now()
oldTime := currentTime.AddDate(0, 0, -1) //之前就是-1

3.获取7天前的时间

1
2
currentTime := time.Now()
oldTime := currentTime.AddDate(0, 0, -7)

4.获取5天后的时间

1
2
3

currentTime := time.Now()
newTime := currentTime.AddDate(0, 0, 5) //5天后的日期就是正整数

5.两个时间相减

1
2
3
4
currentTime := time.Now()
newTime := currentTime.Add(time.Hour * 5)
t8:=newTime.Sub(currentTime)
fmt.Println(t8)

时间格式化

golang的时间格式化和其它语言格式化非常不一样,可以说独具一格。其它语言基本上为Y-m-d 或者YYYY-MM-DD这种类似。golang以是”2006 01 02 15 04 05”分别来代表
年、月、日、时、分、秒。记录口诀就是2006 1 2 3(下午的3点) 4 5

类型 表示
2006
01
02
15
04
05

样例
1.将当前时间格式成”2020/02/03 15:21:00”这种类型

1
2
3
4

currentTime := time.Now()
currentStr := currentTime.Format("2006/01/02 15:04:05")
fmt.Println(currentStr)

输出结果

1
2020/05/15 15:33:13

2.格式化精确到毫秒
在秒后面加上.000即可

1
2
3
currentTime := time.Now()
currentStr := currentTime.Format("2006/01/02 15:04:05.000")
fmt.Println(currentStr)

输出结果

1
2020/05/15 15:34:52.040

解析字符串时间

如果解析一个字符串时间呢?比如我们现在要解析字符串”2020-03-25 05:02:00”
使用Parse会根据当前时区来解析

1
2
3
4
timeStr := "2020-03-25 05:02:00"

strToTime,_ := time.Parse("2006-01-02 15:04:05",timeStr)
fmt.Println(strToTime,reflect.TypeOf(strToTime))

将字符串时间解析成指定时区时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
	//加载时区
loc,err := time.LoadLocation("America/New_York")
if err != nil{
fmt.Println(err)
return
}

timeStr := "2020-03-25 05:02:00"

strToTime,_ := time.ParseInLocation("2006-01-02 15:04:05",timeStr,loc) //指定时区变量
fmt.Println(strToTime,reflect.TypeOf(strToTime))
```

***将UTC时间"2020-05-14 02:08:23"转成当前时间***

``` go
utcTime := "2020-05-14 02:08:23"

tm,_:=time.Parse("2006-01-02 15:04:05",utcTime) //先格式化成UTC的时间

timeStamp3:=tm.Unix() //获得时间戳
tLocal:=time.Unix(timeStamp3,0) //将时间戳转成Time类型
fmt.Println(tLocal) //输出

常见用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//时间类型比较,是否在Time之后
After(u Time) bool

//时间类型比较,是否在Time之前
Before(u Time) bool

//比较两个时间是否相等
Equal(u Time) bool

//判断时间是否为零值,如果sec和nsec两个属性都是0的话,则该时间类型为0
IsZero() bool

//返回年月日,三个参数
Date() (year int, month Month, day int)

//返回年份
Year() int

//返回月份.是Month类型
Month() Month

//返回多少号
Day() int

//返回星期几,是Weekday类型
Weekday() Weekday

//返回年份,和该填是在这年的第几周.
ISOWeek() (year, week int)

//返回小时,分钟,秒
Clock() (hour, min, sec int)

//返回小时
Hour() int

//返回分钟
Minute() int

//返回秒数
Second() int

//返回纳秒
Nanosecond() int