不用说,几乎是开发必须用到的包之一。time包的说明文档在:
http://golang.org/pkg/time/
先注意下Overview中的一句话:
The calendrical calculations always assume a Gregorian calendar.
这个包的时间计算式是基于格里历,就是我们使用的公历。关于格里历的历史,可以看百度百科:
http://baike.baidu.com/view/391054.htm
看看godoc文档,最大的数据类型就是Time了,这个Time类型最微小可以表示到nanosecond(微毫秒,十亿份之一秒)。
Time的比较是使用Before,After和Equal方法。看一眼After:
func (t Time) After(u Time) bool
很好,返回的是bool类型,是我们所需要的。
Sub方法返回的是两个时间点之间的时间距离,看上图看到它返回的是Duration结构,这个结构的具体类型和操作也在godoc中
Add方法和Sub方法是相反的,获取t0和t1的时间距离d是使用Sub,将t0加d获取t1就是使用Add方法
IsZero方法:Time的zero时间点是January 1, year 1, 00:00:00 UTC,这个函数判断一个时间是否是zero时间点
Local,UTC,Ln是用来显示和计算地区时间的。
下面从几个需求直接看time的使用
1 请打出当前时间的时间戳,然后将时间戳格式为年月日时分秒的形式
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
|
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now().Unix()
fmt.Println(t)
fmt.Println(time.Unix(t, 0 ).String())
t = time.Now().UnixNano()
fmt.Println(t)
fmt.Println( "------------------" )
fmt.Println(time.Now().String())
fmt.Println(time.Now().Format( "2006year 01month 02day" ))
}
|
显示:
特别是Format这个函数,可以好好使用
2 输出当前星期几?
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
fmt.Println(t.Weekday().String())
}
|
文档中对这个Weekday类型就没有说明!!没法,直接看代码可以看到:
Weekday有一个String()方法
好了,看到这里外带我们有一个推测:
当一个结构中有定义String()函数的时候,fmt.Println()是会调用String的
例子如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package main
import (
"fmt"
)
type MyStruct struct{
}
func (d MyStruct)String() string { return "mystruct" }
func main() {
me := new (MyStruct)
fmt.Println(me)
}
|
Go的Time之旅结束!!
go语言的time包
组成
- time.Duration(时长,耗时)
- time.Time(时间点)
- time.C(放时间点的管道)[ Time.C:=make(chan time.Time) ]
time包里有2个东西,一个是时间点,另一个是时长 时间点的意思就是“某一刻”,比如 2000年1月1日1点1分1秒 那一刻(后台记录的是unix时间,从1970年开始计算) 时长就是某一刻与另一刻的差,也就是耗时
函数
Sleep函数
time.Sleep(time.Duration) 表示睡多少时间,睡觉时,是阻塞状态
fmt.Println("start sleeping...")
time.Sleep(time.Second)
fmt.Println("end sleep.")
After函数
time.After(time.Duration) 和Sleep差不多,意思是多少时间之后,但在取出管道内容前不阻塞
fmt.Println("the 1")
tc:=time.After(time.Second)
fmt.Println("the 1")
tc:=time.After(time.Second * 2)
AfterFunc函数
time.AfterFunc(time.Duration,func()) 和After差不多,意思是多少时间之后在goroutine line执行函数
f := func() {
fmt.Println("Time out")
}
time.AfterFunc(1*time.Second, f)
time.Sleep(2 * time.Second)
由于f函数不是在Main Line执行的,而是注册在goroutine Line里执行的 所以一旦后悔的话,需要使用Stop命令来停止即将开始的执行,如果已经开始执行就来不及了
houhui := true
f := func() {
fmt.Println("Time out")
}
ta := time.AfterFunc(2*time.Second, f)
time.Sleep(time.Second)
if houhui {
ta.Stop()
}
time.Sleep(3 * time.Second)
Tick函数
time.Tick(time.Duration) 和After差不多,意思是每隔多少时间后,其他与After一致
fmt.Println("the 1")
tc:=time.Tick(time.Second)
time.Time的方法(time.Time自己独有的函数)
Before & After方法
判断一个时间点是否在另一个时间点的前面(后面),返回true或false
t1:=time.Now()
time.Sleep(time.Second)
t2:=time.Now()
a:=t2.After(t1)
Sub方法
两个时间点相减,获得时间差(Duration)
t1:=time.Now()
time.Sleep(time.Second)
t2:=time.Now()
d:=t2.Sub(t1)
Add方法
拿一个时间点,add一个时长,获得另一个时间点
t1:=time.Now()
|
请发表评论