time包学习练习测试
时间类型:time.Time
获取当前时间对象time.Now()
,然后就可以通过这个时间对象获得详细的时间信息了,包括年月日时分秒等信息。
func main() {
//初始化一个新的时间对象
now := time.Now()
//now类型为time.Time
fmt.Printf("now:\nType:%T \nvilue:%v \n", now, now)
//拿到当前的年份信息,数据类型int
year := now.Year()
fmt.Printf("year:\nType:%T value:%#v \n", year, year)
//拿到当前的月份信息,数据类型time.Month
month := now.Month()
fmt.Printf("month:\nType:%T value:%#v \n", month, month)
//今天几号?数据类型:int
day := now.Day()
fmt.Printf("day:\nType:%T value:%#v \n", day, day)
//时,数据类型:int
hour := now.Hour()
fmt.Printf("hour:\nType:%T value:%#v \n", hour, hour)
//分:数据类型:int
minute := now.Minute()
fmt.Printf("minute:\nType:%T value:%#v \n", minute, minute)
//秒:数据类型:int
second := now.Second()
fmt.Printf("second:\nType:%T value:%#v \n", second, second)
}
为啥这么奇怪只有月份是time.Month
类型,年日时分秒都是int
类型~~
时间戳
时间戳是自1970年1月1日(08:00:00GMT)至当前时间的总毫秒数。它也被称为Unix时间戳(UnixTimestamp)。基于时间对象获取时间戳的示例代码如下:
func main() {
//初始化一个新的时间对象
now := time.Now()
//now类型为time.Time
fmt.Printf("now:\nType:%T \nvilue:%v \n", now, now)
//毫秒时间戳数据类型:int64
uinx := now.Unix()
fmt.Printf("Uinx:\nType:%T \nvilue:%v \n", uinx, uinx)
//纳秒时间戳数据类型:int64
uinxnano := now.UnixNano()
fmt.Printf("UinxNano:\nType:%T \nvilue:%v \n", uinxnano, uinxnano)
}
把时间戳换回时间对象,转换以后的数据等同于time.Now()
func main() {
//初始化一个新的时间对象
now := time.Now()
//now类型为time.Time
fmt.Printf("now:\nType:%T \nvilue:%v \n", now, now)
//毫秒时间戳数据类型:int64
uinx := now.Unix()
// fmt.Printf("Uinx:\nType:%T \nvilue:%v \n", uinx, uinx)
//把时间戳转换为时间对象,time.Time类型。转换以后就是time.Now()
timeOBJ := time.Unix(uinx, 0)
fmt.Printf("timeOBJ:\nType:%T \nvilue:%v \n", timeOBJ, timeOBJ)
}
时间间隔
time.Duration
是time
包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。time.Duration
表示一段时间间隔,可表示的最长时间段大约290年。time包中定义的时间间隔类型的常量如下:
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
例如:time.Duration表示1纳秒,time.Second表示1秒。
时间操作
Add
我们在日常的编码过程中可能会遇到要求时间+时间间隔的需求,Go语言的时间对象有提供Add方法如下
func main() {
//初始化一个新的时间对象
now := time.Now()
//now类型为time.Time
fmt.Printf("now:\nType:%T \nvilue:%v \n", now, now)
//now2当前时间加上24小时
now2 := now.Add(time.Hour * 23)
fmt.Printf("now2:\nType:%T \nvilue:%v \n", now2, now2)
//当前时间减去now2,返回的是这两个时间之间隔多长时间,允许后now3是-24h0m0s
now3 := now.Sub(now2)
fmt.Printf("now3:\nType:%T \nvilue:%v \n", now3, now3)
}
ParseDuration
ParseDuration解析一个时间段字符串。一个时间段字符串是一个序列,每个片段包含可选的正负号、十进制数、可选的小数部分和单位后缀,如300ms
、-1.5h
、2h45m
。合法的单位有ns
、us
/µs
、ms
、s
、m
、h
。说人话就是把类似与2h3m45s
解析为time.Duration
类型数据,看下例:
解析字符串格式是时间为k
func main() {
//合法的字符串时间间隔
a := "2h32m50s"
fmt.Printf("a:\nType:%T Value:%#v \n", a, a)
//解析合法的字符串类型时间间隔为time.Duration类型
b, err := time.ParseDuration(a)
if err != nil {
fmt.Printf("time.ParseDuration()参数有误,无法识别。\nErr:%v \n", err)
}
fmt.Printf("b:\nType:%T Value:%#v \n", b, b)
}
休眠函数time.Sleep()
func main() {
fmt.Println("开始休眠~~~")
//time.Sleep()休眠函数
time.Sleep(time.Second * 3)
fmt.Println("3秒钟过去了~~~")
}
定时器函数time.Tick()
使用time.Tick(时间间隔)
来设置定时器,定时器的本质上是一个通道(channel)。
func main() {
a := time.Tick(time.Second * 2)
fmt.Printf("a: \nType:%T value:%#v \n", a, a)
//这里要用for rangge来遍历a,来获得定时执行任务的时间间隔
for i := range a {
fmt.Printf("i: \nType:%T value:%#v \n", i, i)
}
}
比较时间
time.Before
和time.After
比较两个时间的先后顺序。
func main() {
//now为当前时间
now0 := time.Now()
//now为当前时间加25个小时
now1 := now0.Add(time.Hour * 25)
//Before函数比较now0和now1,如果now0在前返回true,否则返回false
fmt.Println(now0.Before(now1))
//After函数如果now0在now1之后返回true,否则返回false
fmt.Println(now0.After(now1))
}
Equal
func (t Time) Equal(u Time) bool
判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。本方法和用t==u
不同,这种方法还会比较地点和时区信息。
时区转换
func main() {
//设定时区为b,此时b的数据类型为*time.Location
b, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Println(err)
}
fmt.Printf("b: \nType:%T \nValue:%v \n", b, b)
//now为当前系统默认时区时间
now0 := time.Now()
//把获取到的系统时间转换为上海时间。
a := now0.In(b)
fmt.Printf("a: \nType:%T \nValue:%v \n", a, a)
}