脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - go语言中time包的各种函数总结

go语言中time包的各种函数总结

2023-04-16 17:15西瓜味儿的柚子 Golang

时间和日期是我们编程中经常会用到的,下面这篇文章主要给大家介绍了关于go语言中time包的各种函数总结的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

前言

在我们开发的过程中,每个项目都需要时间这一类的函数,此时,对time这个包的研究深度就显得尤为重要,现在,对time包中的各种函数做出一个总结,加深一些记忆,

时间类型

Go语言中,time.Time类型表示时间。我们可以通过time.Now函数获取当前时间的对象,然后从时间对象中获取到年,月,日,时,分,秒等信息,代码如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
// timeDemo 时间对象的年月日时分秒
func timeDemo() {
    now := time.Now() // 获取当前时间
    fmt.Printf("current time:%v\n", now)
 
    year := now.Year()     // 年
    month := now.Month()   // 月
    day := now.Day()       // 日
    hour := now.Hour()     // 小时
    minute := now.Minute() // 分钟
    second := now.Second() // 秒
    fmt.Println(year, month, day, hour, minute, second)
}

Location和time zone

Go 语言中使用 location 来映射具体的时区。时区(Time Zone)是根据世界各国家与地区不同的经度而划分的时间定义,全球共分为24个时区。中国差不多跨5个时区,但为了使用方便只用东八时区的标准时即北京时间为准。

下面的示例代码中使用beijing来表示东八区8小时的偏移量,其中time.FixedZone和time.LoadLocation`这两个函数则是用来获取location信息。

?
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
27
28
29
30
31
32
33
34
35
// timezoneDemo 时区示例
func timezoneDemo() {
    // 中国没有夏令时,使用一个固定的8小时的UTC时差。
    // 对于很多其他国家需要考虑夏令时。
    secondsEastOfUTC := int((8 * time.Hour).Seconds())
    // FixedZone 返回始终使用给定区域名称和偏移量(UTC 以东秒)的 Location。
    beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)
 
    // 如果当前系统有时区数据库,则可以加载一个位置得到对应的时区
    // 例如,加载纽约所在的时区
    newYork, err := time.LoadLocation("America/New_York") // UTC-05:00
    if err != nil {
        fmt.Println("load America/New_York location failed", err)
        return
    }
    fmt.Println()
    // 加载上海所在的时区
    //shanghai, err := time.LoadLocation("Asia/Shanghai") // UTC+08:00
    // 加载东京所在的时区
    //tokyo, err := time.LoadLocation("Asia/Tokyo") // UTC+09:00
 
    // 创建时间对象需要指定位置。常用的位置是 time.Local(当地时间) 和 time.UTC(UTC时间)。
    //timeInLocal := time.Date(2009, 1, 1, 20, 0, 0, 0, time.Local)  // 系统本地时间
    timeInUTC := time.Date(2009, 1, 1, 12, 0, 0, 0, time.UTC)
    sameTimeInBeijing := time.Date(2009, 1, 1, 20, 0, 0, 0, beijing)
    sameTimeInNewYork := time.Date(2009, 1, 1, 7, 0, 0, 0, newYork)
 
    // 北京时间(东八区)比UTC早8小时,所以上面两个时间看似差了8小时,但表示的是同一个时间
    timesAreEqual := timeInUTC.Equal(sameTimeInBeijing)
    fmt.Println(timesAreEqual)
 
    // 纽约(西五区)比UTC晚5小时,所以上面两个时间看似差了5小时,但表示的是同一个时间
    timesAreEqual = timeInUTC.Equal(sameTimeInNewYork)
    fmt.Println(timesAreEqual)
}

时间间隔

time.Duration是time包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。time.Duration表示一段时间间隔,可表示的最长时间段大约290年。

Add

?
1
2
3
4
5
func main() {
    now := time.Now()
    later := now.Add(time.Hour) // 当前时间加1小时后的时间
    fmt.Println(later)
}

sub

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

?
1
func (t Time) Sub(u Time) Duration

Before

如果t代表的时间点在u之前,返回真;否则返回假

?
1
func (t Time) Before(u Time) bool

After

如果t代表的时间点在u之后,返回真;否则返回假。

?
1
func (t Time) After(u Time) bool

定时器

使用time.Tick(时间间隔)来设置定时器,定时器的本质上是一个通道(channel)。

?
1
2
3
4
5
6
unc tickDemo() {
    ticker := time.Tick(time.Second) //定义一个1秒间隔的定时器
    for i := range ticker {
        fmt.Println(i)//每秒都会执行的任务
    }
}

时间格式化

time.Format函数能够将一个时间对象格式化输出为指定布局的文本表示形式,需要注意的是 Go 语言中时间格式化的布局不是常见的Y-m-d H:M:S,而是使用 2006-01-02 15:04:05.000(记忆口诀为2006 1 2 3 4 5)。

其中:

2006:年(Y)
01:月(m)
02:日(d)
15:时(H)
04:分(M)
05:秒(S)`

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// formatDemo 时间格式化
func formatDemo() {
    now := time.Now()
    // 格式化的模板为 2006-01-02 15:04:05
 
    // 24小时制
    fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))
    // 12小时制
    fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan"))
 
    // 小数点后写0,因为有3个0所以格式化输出的结果也保留3位小数
    fmt.Println(now.Format("2006/01/02 15:04:05.000")) // 2022/02/27 00:10:42.960
    // 小数点后写9,会省略末尾可能出现的0
    fmt.Println(now.Format("2006/01/02 15:04:05.999")) // 2022/02/27 00:10:42.96
 
    // 只格式化时分秒部分
    fmt.Println(now.Format("15:04:05"))
    // 只格式化日期部分
    fmt.Println(now.Format("2006.01.02"))
}

时间格式化的时间

对于从文本的时间表示中解析出时间对象,time包中提供了time.Parse和time.ParseInLocation两个函数。

其中time.Parse在解析时不需要额外指定时区信息。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// parseDemo 指定时区解析时间
func parseDemo() {
    // 在没有时区指示符的情况下,time.Parse 返回UTC时间
    timeObj, err := time.Parse("2006/01/02 15:04:05", "2022/10/05 11:25:20")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(timeObj) // 2022-10-05 11:25:20 +0000 UTC
 
    // 在有时区指示符的情况下,time.Parse 返回对应时区的时间表示
    // RFC3339     = "2006-01-02T15:04:05Z07:00"
    timeObj, err = time.Parse(time.RFC3339, "2022-10-05T11:25:20+08:00")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(timeObj) // 2022-10-05 11:25:20 +0800 CST

总结

到此这篇关于go语言中time包的各种函数总结的文章就介绍到这了,更多相关go语言time包内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_58181788/article/details/124200511

延伸 · 阅读

精彩推荐
  • GolangGolang中如何使用lua进行扩展详解

    Golang中如何使用lua进行扩展详解

    这篇文章主要给大家介绍了关于Golang中如何使用lua进行扩展的相关资料,这是最近在工作中遇到的一个问题,觉着有必要分享出来给大家学习,文中给出了...

    pinecone5452020-05-09
  • Golanggolang 并发安全Map以及分段锁的实现方法

    golang 并发安全Map以及分段锁的实现方法

    这篇文章主要介绍了golang 并发安全Map以及分段锁的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    薛薛薛3822020-05-23
  • Golanggolang select 机制和超时问题

    golang select 机制和超时问题

    golang 中的协程使用非常方便,但是协程什么时候结束是一个控制问题,可以用 select 配合使用,这篇文章主要介绍了golang select 机制和超时问题,需要的朋友...

    拾荒志6512022-06-26
  • GolangGo语言的IO库那么多纠结该如何选择

    Go语言的IO库那么多纠结该如何选择

    在Go语言中涉及 I/O 操作的内置库有很多种,比如: io 库, os 库, ioutil 库, bufio 库, bytes 库, strings 库等等。拥有这么多内置库是好事,但是具体到涉及...

    Go语言教程网12442021-08-10
  • GolangGolang中的path/filepath包用法

    Golang中的path/filepath包用法

    这篇文章主要介绍了Golang中的path/filepath包用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    思维的深度13382021-03-15
  • GolangGo语言Echo服务器的方法

    Go语言Echo服务器的方法

    这篇文章主要介绍了Go语言Echo服务器的方法,实例分析了Echo服务器的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    Go语言编程实例3952020-04-18
  • GolangGolang中Interface接口的三个特性

    Golang中Interface接口的三个特性

    本文详细讲解了Golang中Interface接口的三个特性,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

    WingPig8212022-07-19
  • GolangGoFrame gtree树形结构的使用技巧示例

    GoFrame gtree树形结构的使用技巧示例

    这篇文章主要为大家介绍了GoFrame gtree树形结构的使用技巧示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    王中阳Go8092022-10-17