• Go 之 time 模块相应函数及示例


    时间获取

    time.Hours()

    time.Hours()函数就是用于获取时间点以来的小时数。

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. t1 := time.Now()
    8. t2, _ := time.Parse("2006-01-02 15:04:05 -0700 MST", "2023-12-24 14:41:40 +0800 CST")
    9. hours := t2.Sub(t1)
    10. fmt.Println(hours.Hours()) // 3021.5102945206113
    11. }

    time.Clock()

    主要用于获取一个 time.Time 值的小时、分钟和秒数。

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. now := time.Now()
    8. hour, min, sec := now.Clock()
    9. fmt.Printf("now is %02d:%02d:%02d\n", hour, min, sec) // now is 11:40:22
    10. }

    time.Hour()/Minute()/Second()

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. t := time.Now() // 获取当前时间
    8. hour := t.Hour()
    9. fmt.Println(hour) // 输出当前时间的小时数
    10. minute := t.Minute()
    11. fmt.Println(minute) // 输出当前时间的分钟数
    12. second := t.Second()
    13. fmt.Println(second) // 输出当前时间的秒数
    14. }

    time.Date()

    主要用于获取 time.Time 类型变量表示的时间的年月日信息。

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. t := time.Now()
    8. year, month, day := t.Date()
    9. fmt.Printf("now is %04d-%02d-%02d\n", year, month, day) // now is 2023-09-10
    10. }

    time.Day()

    time.Time.Day()函数是一个用来获取当前时间的天数的函数。

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. // 当前时间
    8. t := time.Now()
    9. // 获取当前时间的天数
    10. day := t.Day()
    11. // 输出结果
    12. fmt.Printf("today is %d号\n", day) // today is 9号
    13. }

    time.Weekday()

    time.Weekday()函数用来获取当前时间的星期。

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. now := time.Now()
    8. fmt.Println("today is", now.Weekday()) // today is Monday
    9. }

    时间解析

    time.Parse()

    time.Parse()函数将字符串转换为了Time类型。其中第一个参数是时间格式,第二个参数是待转换的字符串。

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. t, _ := time.Parse("2006-01-02 15:04:05 -0700 MST", "2021-12-24 14:41:40 +0800 CST")
    8. fmt.Printf("Time: %v\n", t) // Time: 2021-12-24 14:41:40 +0800 CST
    9. }

     time.ParseDuration()

    时间间隔解析

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. d, _ := time.ParseDuration("3600s")
    8. fmt.Printf("Duration in seconds: %f\n", d.Seconds())
    9. d, _ = time.ParseDuration("1.5h")
    10. fmt.Printf("Duration in minutes: %f\n", d.Minutes())
    11. d, _ = time.ParseDuration("2h45m")
    12. fmt.Printf("Duration in hours: %f\n", d.Hours())
    13. d, _ = time.ParseDuration("1m30s")
    14. fmt.Printf("Duration in nanoseconds: %d\n", d.Nanoseconds())
    15. d, _ = time.ParseDuration("500ms")
    16. fmt.Printf("Duration in microseconds: %d\n", d.Microseconds())
    17. // Duration in seconds: 3600.000000
    18. // Duration in minutes: 90.000000
    19. // Duration in hours: 2.750000
    20. // Duration in nanoseconds: 90000000000
    21. // Duration in microseconds: 500000
    22. }

    时间格式化

    time.Format()

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. now := time.Now()
    8. a := now.AppendFormat([]byte{}, time.RFC3339)
    9. a2 := now.Format(time.RFC3339)
    10. fmt.Println(string(a)) // 2023-09-10T11:25:32+08:00
    11. fmt.Println(a2) // 2023-09-10T11:25:32+08:00
    12. layout := "Jan 2, 2006 at 3:04pm (MST)"
    13. b := now.AppendFormat([]byte{}, layout)
    14. b2 := now.Format(layout)
    15. fmt.Println(string(b)) // Sep 10, 2023 at 11:25am (CST)
    16. fmt.Println(b2) // Sep 10, 2023 at 11:25am (CST)
    17. layout = "2006-01-02 15:04:05"
    18. c := now.AppendFormat([]byte{}, layout)
    19. c2 := now.Format(layout)
    20. fmt.Println(string(c)) // 2023-09-10 11:25:32
    21. fmt.Println(c2) // 2023-09-10 11:25:32
    22. layout = "2006-01-02 15:04:05.000"
    23. fmt.Println(now.Format(layout)) // 2023-09-10 11:25:32 612
    24. layout = "2006-01-02 15:04:05.999"
    25. fmt.Println(now.Format(layout)) // 2023-09-10 11:25:32 612
    26. layout = "2006-01-02"
    27. fmt.Println(now.Format(layout)) // 2023-09-10
    28. layout = "15:04:05"
    29. fmt.Println(now.Format(layout)) // 11:25:32
    30. }

    时间序列化

    time.GobEncode()

    1. package main
    2. import (
    3. "bytes"
    4. "encoding/gob"
    5. "fmt"
    6. "time"
    7. )
    8. type TimeWrapper struct {
    9. Time time.Time
    10. }
    11. func main() {
    12. var buffer bytes.Buffer
    13. encoder := gob.NewEncoder(&buffer)
    14. now := TimeWrapper{Time: time.Now()}
    15. err := encoder.Encode(&now)
    16. if err != nil {
    17. fmt.Println("encode error: ", err)
    18. }
    19. var otherTime TimeWrapper
    20. decoder := gob.NewDecoder(&buffer)
    21. err = decoder.Decode(&otherTime)
    22. if err != nil {
    23. fmt.Println("decode error: ", err)
    24. }
    25. fmt.Println(now.Time) // 2023-09-10 12:15:57.6990592 +0800 CST m=+0.001000001
    26. fmt.Println(otherTime.Time) // 2023-09-10 12:15:57.6990592 +0800
    27. }

    时间定时器

    time.After()

    time.After() 函数用于创建一个 Timer 对象并在指定的持续时间后向其 C 字段发送一个时间值。当然,如果在循环中多路复用使用 time.After 的话,记得不要在 case 直接写 time.After 哟,因为每一次执行 select 的 time.After() 都会重新开始计时。

    1. package main
    2. import (
    3. "time"
    4. "fmt"
    5. )
    6. func main() {
    7. ch := make(chan int)
    8. go func() {
    9. fmt.Println("Start goroutine...")
    10. time.Sleep(3 * time.Second)
    11. ch <- 1
    12. }()
    13. select {
    14. case <- ch:
    15. fmt.Println("chan get message")
    16. case <- time.After(2 * time.Second):
    17. fmt.Println("timeout!") // timeout!
    18. }
    19. }

    time.AfterFunc()

    time.AfterFunc()函数是在指定的时间之后执行一个函数的方法。

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. fmt.Println("Start main...")
    8. fmt.Println("print hello world after 5 seconds...")
    9. time.AfterFunc(time.Second*5, func() {
    10. fmt.Println("hello world")
    11. })
    12. time.Sleep(time.Second*10)
    13. fmt.Println("the end")
    14. // Start main...
    15. // print hello world after 5 seconds...
    16. // hello world
    17. // the end
    18. }

     time.NewTicker()

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. fmt.Println("Program started.", time.Now().Format("2006-01-02 15:04:05"))
    8. timer := time.NewTimer(3 * time.Second)
    9. <- timer.C
    10. fmt.Println("Timer expired.", time.Now().Format("2006-01-02 15:04:05"))
    11. ticker := time.NewTicker(2 * time.Second)
    12. defer ticker.Stop()
    13. for {
    14. select {
    15. case <-ticker.C:
    16. fmt.Println("ticker:", time.Now().Format("2006-01-02 15:04:05"))
    17. }
    18. }
    19. // Program started. 2023-09-02 14:02:06
    20. // Timer expired. 2023-09-02 14:02:09
    21. // ticker: 2023-09-02 14:02:11
    22. // ticker: 2023-09-02 14:02:13
    23. }

    time.Tick()

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. ticker := time.Tick(2 * time.Second)
    8. count := 0
    9. for now := range ticker {
    10. count++
    11. fmt.Printf("%d: %s\n", count, now)
    12. if count == 5 {
    13. break
    14. }
    15. }
    16. // 1: 2023-09-02 15:47:57.8208432 +0800 CST m=+2.002114501
    17. // 2: 2023-09-02 15:47:59.8209576 +0800 CST m=+4.002228901
    18. // 3: 2023-09-02 15:48:01.821072 +0800 CST m=+6.002343301
    19. // 4: 2023-09-02 15:48:03.8211864 +0800 CST m=+8.002457701
    20. // 5: 2023-09-02 15:48:05.8213008 +0800 CST m=+10.002572101
    21. }

    time.Ticker.Stop()

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. ticker := time.NewTicker(time.Second)
    8. defer ticker.Stop()
    9. for {
    10. select {
    11. case <-ticker.C:
    12. fmt.Println("Ticker tick")
    13. }
    14. }
    15. }

    时间戳

    time.Unix()

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. now := time.Now().Unix()
    8. fmt.Println("Unix时间戳( 秒)为:", now)
    9. milli := time.Now().UnixMilli()
    10. fmt.Println("Unix时间戳(毫秒)为:", milli)
    11. micro := time.Now().UnixMicro()
    12. fmt.Println("Unix时间戳(微秒)为:", micro)
    13. nano := time.Now().UnixNano()
    14. fmt.Println("Unix时间戳(纳秒)为:", nano)
    15. // Unix时间戳(秒) 为: 1692523606
    16. // Unix时间戳(毫秒)为: 1692523606723
    17. // Unix时间戳(微秒)为: 1692523606723707
    18. // Unix时间戳(纳秒)为: 1692523606723707200
    19. }

    time.Second

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. nano := time.Now().UnixNano()
    8. fmt.Println("Unix时间戳(纳秒)为:", nano)
    9. fmt.Println("Unix时间戳(纳秒)为:", nano / int64(time.Nanosecond))
    10. fmt.Println("Unix时间戳(微秒)为:", nano / int64(time.Microsecond))
    11. fmt.Println("Unix时间戳(毫秒)为:", nano / int64(time.Millisecond))
    12. fmt.Println("Unix时间戳( 秒)为:", nano / int64(time.Second))
    13. // Unix时间戳(纳秒)为: 1692531897930937100
    14. // Unix时间戳(纳秒)为: 1692531897930937100
    15. // Unix时间戳(微秒)为: 1692531897930937
    16. // Unix时间戳(毫秒)为: 1692531897930
    17. // Unix时间戳( 秒)为: 1692531897
    18. }

    时间计算

    time.Round()

    四舍五入

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. t := time.Date(2021, 1, 17, 4, 37, 0, 0, time.UTC)
    8. fmt.Println(t.Round(time.Hour)) // 输出:2021-01-17 05:00:00 +0000 UTC
    9. fmt.Println(t.Round(30 * time.Minute)) // 输出:2021-01-17 04:30:00 +0000 UTC
    10. }

    time.Since()

    计算当前时间和开始时间的间隔

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. start := time.Date(2023, 9, 1, 4, 37, 0, 0, time.UTC)
    8. diff := time.Since(start)
    9. fmt.Println(diff) // 26h19m50.8567339s
    10. }

    time.Add()

    在时间点上加上一个固定时长,例如 2 个小时、5 分钟等;或根据时间信息,计算出距离当前时间点一定时长之后的时间。

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. t1 := time.Now()
    8. t2 := t1.Add(5 * time.Minute)
    9. t3 := t1.Add(2 * time.Hour)
    10. fmt.Println(t1)
    11. fmt.Println(t2)
    12. fmt.Println(t3)
    13. // 2023-09-10 11:12:09.7998193 +0800 CST m=+0.000000001
    14. // 2023-09-10 11:17:09.7998193 +0800 CST m=+300.000000001
    15. // 2023-09-10 13:12:09.7998193 +0800 CST m=+7200.000000001
    16. }

    time.AddDate()

    它接受三个参数:yearsmonthsdays,分别表示要增加(或减少)的年数、月数和天数。

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. t := time.Date(2023, time.May, 18, 0, 0, 0, 0, time.UTC)
    8. t2 := t.AddDate(1, 2, 3)
    9. fmt.Println(t2) // 2024-07-21 00:00:00 +0000 UTC
    10. }

    time.Sub()

    求两个时间之间的差值。返回一个时间段t-u。如果结果超出了Duration可以表示的最大值/最小值,将返回最大值/最小值。要获取时间点t-d(d为Duration),可以使用t.Add(-d)。

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. t1 := time.Now()
    8. t2 := t1.Add(5 * time.Minute)
    9. t3 := t2.Sub(t1)
    10. fmt.Println(t1)
    11. fmt.Println(t2)
    12. fmt.Println(t3)
    13. // 2023-09-10 11:12:09.7998193 +0800 CST m=+0.000000001
    14. // 2023-09-10 11:17:09.7998193 +0800 CST m=+300.000000001
    15. // 5m0s
    16. }

    时间比较

    time.Before()

    time.Time.Before() 用来判断一个时间是否早于另一个时间。

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. // 2022年1月1日
    8. t1 := time.Date(2022, 1, 1, 0, 0, 0, 0, time.UTC)
    9. // 2021年12月31日
    10. t2 := time.Date(2021, 12, 31, 0, 0, 0, 0, time.UTC)
    11. if t2.Before(t1) {
    12. fmt.Println("t2 is earlier than t1") // t2 is earlier than t1
    13. } else {
    14. fmt.Println("t1 is earlier than t2")
    15. }
    16. }

    time.Equal()

    表示要比较的两个时间对象是否表示相同时间。通过调用此方法,我们可以避免手动解析和比较日期和时间。

    1. package main
    2. import (
    3. "fmt"
    4. "time"
    5. )
    6. func main() {
    7. now := time.Now()
    8. n1 := now.Add(5 * time.Second)
    9. n2 := now.Add(10 * time.Second)
    10. fmt.Println(n1.Equal(now)) // false
    11. fmt.Println(n2.Equal(now)) // false
    12. fmt.Println(now.Equal(now)) // true
    13. }

  • 相关阅读:
    C++ 不同继承之间的的关系
    大型语言模型中的幻觉研究综述:原理、分类、挑战和未决问题11.15+11.16+11.17
    Linux 定时删除7天前的文件
    【ARM Coresight 系列文章19.1 -- Cortex-A720 PMU 详细介绍】
    【电路笔记】-有源高通滤波器
    基于java+ssm的理论课_考勤,作业,签到管理系统
    【C++优先级队列priority_queue基础】基本使用,模拟实现,堆
    GBase 8s定制安装
    C++类和对象(中)【万字详解】
    若依(RuoYi)SpringBoot框架密码加密传输(前后分离板)
  • 原文地址:https://blog.csdn.net/TomorrowAndTuture/article/details/132393048