go标准库02 时间与日期

2017-09-28 10:56:14

Go具有良好的时间和日期管理功能。实际上,计算机只会维护一个挂钟时间(wall clock time),这个时间是从某个固定时间起点到现在的时间间隔。时间起点的选择与计算机相关,但一台计算机的话,这一时间起点是固定的。其它的日期信息都是从这一时间计算得到的。

time包
  • 时间

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

    import (
    "fmt"
    "time"
    )

    func main() {
    //时间戳
    t := time.Now().Unix()
    fmt.Print(t)
    }
  • time.sleep()
    可以将程序置于休眠状态,直到某时间间隔之后再唤醒程序,让程序继续运行。

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

    import (
    "fmt"
    "time"
    )

    func main() {
    fmt.Println("start")
    time.Sleep(time.Second * 10) // sleep for 10 seconds
    fmt.Println("wake up")
    }

    当我们需要定时地查看程序运行状态时,就可以利用该方法。

  • time.After(time.Duration)
    和Sleep差不多,在取出管道内容前不阻塞

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package main

    import (
    "fmt"
    "time"
    )

    func main() {
    fmt.Println("this is one")
    tc:=time.After(time.Second)
    fmt.Println("this is two")
    fmt.Println("this is three")
    <-tc //阻塞中,直到取出tc管道里的数据
    fmt.Println("this is four")
    }
    //打印this is one后,获得了一个空管道,这个管道1秒后会有数据进来
    //打印this is two
    //打印this is three
    //等待,直到可以取出管道的数据(取出数据的时间与获得tc管道的时间正好差1秒钟)
    //打印this is four
  • time.AfterFunc(time.Duration,func())
    和After差不多,意思是多少时间之后在goroutine line执行函数

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

    import (
    "time"
    "fmt"
    )

    func main() {
    f := func() {
    fmt.Println("Time out")
    }
    time.AfterFunc(1*time.Second,f)
    time.Sleep(2 * time.Second) //要保证主线比子线“死的晚”,否则主线死了,子线也等于死了
    }
    //将一个间隔和一个函数给AfterFunc后
    //间隔时间过后,执行传入的函数
  • Before & After方法
    判断一个时间点是否在另一个时间点的前面(后面),返回true或false

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

    import (
    "time"
    "fmt"
    )

    func main() {
    t1 := time.Now()
    time.Sleep(time.Second)
    t2 := time.Now()
    a := t2.After(t1)
    fmt.Println(a) //true
    b := t2.Before(t1)
    fmt.Println(b) //false
    }
  • sub方法
    两个时间点相减,获得时间差(Duration)

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

    import (
    "time"
    "fmt"
    )

    func main() {
    t1 := time.Now()
    time.Sleep(time.Second)
    t2 :=time.Now()
    d := t2.Sub(t1) //时间2减去时间1
    fmt.Println(d) //打印结果差不多为1.000123几秒,因为Sleep无法做到精确的睡1秒
    }
  • Add方法
    拿一个时间点,add一个时长,获得另一个时间点

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

    import (
    "time"
    "fmt"
    )

    func main() {
    t1 := time.Now()
    t2 := t1.Add(time.Hour)
    fmt.Println(t2)
    }

您的鼓励是我写作最大的动力

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。