Go语言基础之3--时间和日期序列

 一、时间和日期类型

1. time包

2. time.Time类型,用来表示时间

3. 获取当前时间, now := time.Now()

实例1-1  打印输出当前时间

package main

import (
    "fmt"
    "time"
)

func main() {
    //var now time.Time
    //now = time.Now()
    now := time.Now()
    fmt.Printf("current time is %v\n", now)
}

执行结果:

 

4. 年: time.Now().Year()

    月:time.Now().Month()

    日:time.Now().Day()

    时:time.Now.Hour()

    分:time.Now().Minute()

    秒:time.Now.Second()  

5. 格式化, fmt.Printf(“%02d/%02d%02d %02d:%02d:%02d”, now.Year()…)

实例1-2     格式化输出当前时间

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    fmt.Printf("%02d/%02d/%02d %02d:%02d:%02d",
        now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())
}

 执行结果如下:

 

6. 获取当前时间戳(时间戳就是1970年1月1日0点0分0秒到现在的秒数),

获取方法time.Now().Unix()。

实例1-3    打印当前时间时间戳及以纳秒形式显示

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    fmt.Printf("timestamp:%d ns:%d\n", now.Unix(), now.UnixNano())
}

执行结果如下:

注意:纳秒范围太大,如果要存储,需要用int64类型,不然就溢出了。

 

7. 时间戳转Time类型。

实例1-4

package main

import (
    "fmt"
    "time"
)

func TimestampToTime(timestamp int64) { //时间戳是int64类型,所以我们这里必须定义为int64
    t := time.Unix(timestamp, 0) //传入参数对应的是秒和纳秒,这里把时间戳类型转化为time类型,因为传入的时间戳单位是秒,所以对应的纳秒我们写为0即可。
    fmt.Printf("convert timestamp to time:%v\n", t)
}

func main() {
    now := time.Now()
    TimestampToTime(now.Unix()) //传入的参数为当前的时间戳(单位是秒)
}

执行结果如下:

 

8. 定时器的简单使用(项目会用到(定时任务))

方法1:Newtimer(注意:只触发1次,必须reset,否则会堵塞)

实例1-5

package main

import (
    "fmt"
    "time"
)

func testTimer() { //testTimer是遍历时间定时器的函数
    timer := time.NewTimer(time.Second) //Newtimer相当于一个定时器,只触发一次
    //time.second表示1秒,newtimer中用到了duration函数,其单位为纳秒,1秒等于10亿纳秒,太大,所以go语言中已经写好了这个方法,time.second表示1秒
    for v := range timer.C {
        //使用range类型去遍历channel,现在是当为1秒时(每隔1秒)去执行一下for循环
        fmt.Printf("time:%v\n", v)
        timer.Reset(time.Second) //如果不加reset,那么就会死锁(deadlock),因为newtimer只执行一次,之后就不往管道中插入时间,我们也就无法在管道中去遍历,所以会报死锁。
        //加了reset之后,就相当于把当前定时器又重置回0秒,然后定时器到1秒后,又执行1次,这样就达到我们的目的了(不会阻塞,每个1秒重置一次)。
    }
}

func main() {
    testTimer()
    time.Sleep(time.Minute)  //表示main主线程sleep一分钟后退出。
}

执行结果:

 

方法2:NewTicker(不需要reset,每隔1秒去触发1次)

package main

import (
    "fmt"
    "time"
)

func testTicker() {
    timer := time.NewTicker(time.Second)
    for v := range timer.C {
        fmt.Printf("time:%v\n", v)
    }
}
func main() {
    testTicker()
    time.Sleep(time.Minute) //表示main主线程sleep一分钟后退出。
}

执行结果如下:

 

 

9. time.Duration用来表示纳秒

  解释:

  time包中的duration函数,其的单位是纳秒,这也是Go语言中时间最细的一个密度。

 

10. 一些常量,我们也可以直接拿去用:

const (
    Nanosecond Duration = 1
    Microsecond = 1000 * Nanosecond
    Millisecond = 1000 * Microsecond
    Second = 1000 * Millisecond
    Minute = 60 * Second
    Hour = 60 * Minute
)

 

11. 格式化

自带的format方法

2006年1月2日15时04分05秒是go语言诞生的日子,所以format方法的硬性规定就是:如果想格式化时间,并且借助format方法,就必须go语言的诞生时间做代码时间格式化的模板(必须是这个时间,如果不符,输出时间是不正确的):

格式如下:

now := time.Now()
fmt.Println(now.Format(“02/1/2006 15:04:05”))
fmt.Println(now.Format(“2006/1/02 15:04”))
fmt.Println(now.Format(“2006/1/02”))

 

实例1-6 

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    //方法1:
    fmt.Printf("%02d/%02d/%02d %02d:%02d:%02d\n",
        now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())
// 方法2:
// 2016/01/02 15:04:05是go的诞生时间,必须写正确
    str := now.Format("02/01/2006 15:04:05")
    fmt.Printf("str:%s\n", str)
}

 执行结果如下:

二、练习题

练习1:写一个程序,获取当前时间,并格式化成 2017/06/15 08:05:00形式

解答:

思路:此题方法较多,随便用哪一种格式化方法都可以;

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    str := now.Format("2006/01/02 15:04:05")
    fmt.Printf("%s\n", str)
}

执行结果:

练习2:写一个程序,统计一段代码的执行耗时,单位精确到微秒

解答:

思路:代码执行之前获取一下时间,代码执行完在获取一下时间,两个时间相减,即为一段代码执行消耗的时间。

package main

import (
    "fmt"
    "time"
)

func test() { //测试代码函数
    for i := 0; i < 100000000; i++ {
        _ = i //变量i未使用,这里我们忽略掉它
    }
}
func main() {
    //var now time.Time
    //now = time.Now()
    //start := now.UnixNano
    start := time.Now().UnixNano() //开始时间
    test()
    end := time.Now().UnixNano()                 //结束时间
    fmt.Printf("cost=%d us\n", (end-start)/1000) //纳秒转微妙
}

执行结果:

 

posted @ 2018-07-12 12:08  Ambition-LC  阅读(853)  评论(0编辑  收藏  举报