Golang 中的 time 包详解(二):time.Duration

在日常开发过程中,会频繁遇到对时间进行操作的场景,使用 Golang 中的 time 包可以很方便地实现对时间的相关操作。接下来的几篇文章会详细讲解 time 包,本文讲解一下 time 包中的 time.Duration 类型。

time.Duration

time.Duration 类型是一个有符号的 int64 类型,以纳秒为单位,用来表示两个时间点之间的时长。类型定义如下:

复制代码
type Duration int64

拥有的方法如下:

  • func (d Duration) Hours() float64,返回持续的时间,以小时为单位。

  • func (d Duration) Minutes() float64,返回持续的时间,以分钟为单位。

  • func (d Duration) Seconds() float64,返回持续的时间,以秒为单位。

  • func (d Duration) Milliseconds() int64,返回持续的时间,以毫秒为单位。

  • func (d Duration) Microseconds() int64,返回持续的时间,以微秒为单位。

  • func (d Duration) Nanoseconds() int64,返回持续的时间,以纳秒为单位。

  • func (d Duration) String() string,返回一个字符串类型的持续的时间,格式为 "72h3m0.5s"。示例如下:

    package main

    import (
    "fmt"
    "time"
    )

    func main() {
    a := time.Duration(3) * time.Hour
    fmt.Println(a.Hours()) // 3
    fmt.Println(a.Minutes()) // 180
    fmt.Println(a.Seconds()) //10800
    fmt.Println(a.Milliseconds()) //10800000
    fmt.Println(a.Microseconds()) //10800000000
    fmt.Println(a.Nanoseconds()) //10800000000000
    fmt.Println(a.String()) //3h0m0s
    }

  • func (d Duration) Round(m Duration) Duration,返回将 d 四舍五入到 m 的最接近倍数的结果。通过示例理解一下:

    package main

    import (
    "fmt"
    "time"
    )

    func main() {
    a := time.Duration(10) * time.Minute
    // 结果为 10,10 正好是 1 的整数倍
    fmt.Println(a.Round(time.Duration(1) * time.Minute))
    // 结果为 9,3 的 3 倍是 9,3 的 4 倍是 12,9 和 10 离得更近
    fmt.Println(a.Round(time.Duration(3) * time.Minute))
    // 结果为 12,4 的 2 倍是 8,4 的 3 倍是 12,距离一样近往上入
    fmt.Println(a.Round(time.Duration(4) * time.Minute))
    // 结果为 10,10 正好是 5 的整数倍
    fmt.Println(a.Round(time.Duration(5) * time.Minute))
    // 结果为12, 6 的 1 倍是 6,6 的 2 倍是 12,10 离 12 更近
    fmt.Println(a.Round(time.Duration(6) * time.Minute))
    }

  • func (d Duration) Truncate(m Duration) Duration,用于将 d 截断到 m 最近整数倍。通过示例理解一下:

    package main

    import (
    "fmt"
    "time"
    )

    func main() {
    a := time.Duration(10) * time.Minute
    // 结果为 10,10 正好是 1 的整数倍
    fmt.Println(a.Truncate(time.Duration(1) * time.Minute))
    // 结果为 9,3 的 3 倍是 9,最接近 10
    fmt.Println(a.Truncate(time.Duration(3) * time.Minute))
    // 结果为 8,4 的 2 倍是 8,最接近 10
    fmt.Println(a.Truncate(time.Duration(4) * time.Minute))
    // 结果为 10,10 正好是 5 的整数倍
    fmt.Println(a.Truncate(time.Duration(5) * time.Minute))
    // 结果为 6,6 的 1 倍是 6,最接近 10
    fmt.Println(a.Truncate(time.Duration(6) * time.Minute))
    // 结果为 0,11 的 1 倍是11,大于了 10
    fmt.Println(a.Truncate(time.Duration(11) * time.Minute))
    }

加减法运算

因为 time.Duration 表示的是时间段,可以对 time.Duration 类型的值进行加减法运算,例如:

复制代码
package main

import (
	"fmt"
	"time"
)

func main() {
	a := time.Duration(10) * time.Minute
	b := time.Duration(10) * time.Second
	fmt.Println(a + b)
	fmt.Println(a - b)
}
相关推荐
q***98521 分钟前
什么是Spring Boot 应用开发?
java·spring boot·后端
码一行4 分钟前
从0到1用Go撸一个AI应用?Eino框架让你效率翻倍!
后端·go
合作小小程序员小小店10 分钟前
桌面安全开发,桌面二进制%恶意行为拦截查杀%系统安全开发3.0,基于c/c++语言,mfc,win32,ring3,dll,hook,inject,无数据库
c语言·开发语言·c++·安全·系统安全
合作小小程序员小小店10 分钟前
桌面开发,超市管理系统开发,基于C#,winform,sql server数据库
开发语言·数据库·sql·microsoft·sqlserver·c#
Codeking__12 分钟前
C++ 11 atomic 原子性操作
开发语言·c++
掘金一周16 分钟前
大部分人都错了!这才是chrome插件多脚本通信的正确姿势 | 掘金一周 11.27
前端·人工智能·后端
懂得节能嘛.18 分钟前
【Java动态线程池】Redis监控+动态调参
java·开发语言·redis
bcbnb20 分钟前
苹果App上架全流程指南:从注册到审核通过,一文读懂
后端
aiopencode21 分钟前
在 Windows 环境完成 iOS 上架,跨平台发布体系的落地实践
后端
疯狂的程序猴25 分钟前
Fiddler抓包配置与使用教程,HTTPHTTPS抓包、代理设置与接口调试完整指南
后端