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

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

服务器之家 - 脚本之家 - Golang - Go语言Time包的具体使用

Go语言Time包的具体使用

2024-07-24 19:30CodeJR Golang

Go语言中有关于时间和日期的方法都在time包里面,本文主要介绍了Go语言Time包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

time包

Go语言中有关于时间和日期的方法都在time包里面,Go语言的time包为开发者提供了一套全面而简洁的工具来处理时间相关的操作。包括解析和格式化时间字符串,计算时间差和时区转换等,time包时Go语言中处理时间和日期的核心组件。

时间类型(Time)

time包中的Time结构体表示的是时间类型,在Go语言中,我们可以使用time.Now()方法来获取当前的时间,该方法返回的就是Time类型,调用Time类型的方法就可以分别获取到当前时间的年月日时分秒等信息。

func main() {
 now := time.Now()

 fmt.Println(now) // 2024-07-23 19:36:03.4481196 +0800 CST m=+0.004232101

 fmt.Println(now.Year())   // 2024
 fmt.Println(now.Month())  // July
 fmt.Println(now.Day())    // 23
 fmt.Println(now.Hour())   // 19
 fmt.Println(now.Minute()) // 36
 fmt.Println(now.Second()) // 3
}

时间格式化

从上面的输出可以看到当前日期的输出后面还携带了有其他的消息,不是我们常用的格式,这个时候就可以使用Go语言的时间格式化功能,使用format方法并执行格式化模板,Go语言的格式化模版并不是常用的Y-m-d H:M:S,而是2006-01-02 15:04:05,记忆方法:200612345(相传这个时间为Go语言诞生时间,不知真假)。

func main() {
 now := time.Now()
 fmt.Println(now.Format("2006-01-02 15:04:05"))    // 2024-07-23 19:37:58
 fmt.Println(now.Format("2006-01-02 03:04:05 PM")) // 2024-07-23 07:41:20 PM
 fmt.Println(now.Format("2006/01/02 15:04"))       // 2024/07/23 19:40
 fmt.Println(now.Format("15:04 2006/01/02"))       // 19:40 2024/07/23
 fmt.Println(now.Format("2006/01/02"))             // 2024/07/23
}

除了自己写格式化模版之外,Go语言已经内置了一部分模版可供选择,模版在format包里面,可以直接使用,源码如下:

const (
 Layout      = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order.
 ANSIC       = "Mon Jan _2 15:04:05 2006"
 UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
 RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
 RFC822      = "02 Jan 06 15:04 MST"
 RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
 RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
 RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
 RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
 RFC3339     = "2006-01-02T15:04:05Z07:00"
 RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
 Kitchen     = "3:04PM"
 // Handy time stamps.
 Stamp      = "Jan _2 15:04:05"
 StampMilli = "Jan _2 15:04:05.000"
 StampMicro = "Jan _2 15:04:05.000000"
 StampNano  = "Jan _2 15:04:05.000000000"
 DateTime   = "2006-01-02 15:04:05"
 DateOnly   = "2006-01-02"
 TimeOnly   = "15:04:05"
)

时间戳

时间戳是自1970年1月1日(08:00:00GMT)至当前时间的总毫秒数,也被称为Unix时间戳,在Go语言里面,可以获取四种级别的时间戳,分别是秒、毫秒、微秒和纳秒。

func main() {
 now := time.Now()
 fmt.Println(now.Unix())      // 1721735188
 fmt.Println(now.UnixMilli()) // 1721735188504
 fmt.Println(now.UnixMicro()) // 1721735188504566
 fmt.Println(now.UnixNano())  // 1721735188504566800
}

时间间隔

在time包里面还定义了一个Duration类型,Duration表示时间间隔,例如可以直接使用time.Second表示1秒,time.Hour * 3表示3个小时,Duration源码定义如下:

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

时间操作

在Go语言里面还可以非常简单的进行时间的比较以及计算

时间计算

可以使用Add方法在当前时间的基础上加上指定的时间间隔。

func main() {
 now := time.Now()
 fmt.Println(now)                    // 2024-07-23 19:52:14.0840934 +0800 CST m=+0.004981601
 fmt.Println(now.Add(time.Hour * 2)) // 2024-07-23 21:52:14.0840934 +0800 CST m=+7200.004981601
}

时间间隔

还可以使用Sub方法计算两个时间之间相隔了多长时间,

func main() {
 now := time.Now()
 fmt.Println(now.Sub(now.Add(time.Hour * -2))) // 2h0m0s
}

之前

使用Before判断一个时间是否在另一个时间之前

func main() {
 now := time.Now()
 fmt.Println(now.Before(now.Add(time.Hour))) // true
}

之后

使用After判断一个时间是否在另一个时间之后

func main() {
 now := time.Now()
 fmt.Println(now.After(now.Add(time.Hour))) // false
}

相同

使用Equal判断两个时间是否相同

func main() {
 now := time.Now()
 fmt.Println(now.Equal(now.Add(time.Hour))) // false
}

时间转换

字符串转时间

func main() {
 timeStr := "2024-07-23 12:23:34"
 time1, _ := time.Parse(time.DateTime, timeStr)
 fmt.Println(time1) // 2024-07-23 12:23:34 +0000 UTC
 time2, _ := time.ParseInLocation(time.DateTime, timeStr, time.Local)
 fmt.Println(time2) // 2024-07-23 12:23:34 +0800 CST
}

可以使用Parse和ParseInLocation将字符串时间转成Time类型的时间,两者的区别如下:

  • time.Parse 总是将时间解析为 UTC 时区
  • time.ParseInLocation 允许指定一个时区解析

时间戳转时间

func main() {
 time1 := time.Unix(1721735188, 0)
 time2 := time.UnixMilli(1721735188504)
 time3 := time.UnixMicro(1721735188504566)
 fmt.Println(time1) // 2024-07-23 19:46:28 +0800 CST
 fmt.Println(time2) // 2024-07-23 19:46:28.504 +0800 CST
 fmt.Println(time3) // 2024-07-23 19:46:28.504566 +0800 CST
}

使用time包的Unix、UnixMilli和UnixMicro可以分别将秒、毫秒、微秒级别的时间戳转成相应的Time类型的时间。

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

原文链接:https://juejin.cn/post/7394795454582276136

延伸 · 阅读

精彩推荐
  • GolangGolang之casbin权限管理的实现

    Golang之casbin权限管理的实现

    这篇文章主要介绍了Golang之casbin权限管理的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    HaimaBlog11642021-01-30
  • GolangGo语言获取系统性能数据gopsutil库的操作

    Go语言获取系统性能数据gopsutil库的操作

    这篇文章主要介绍了Go语言获取系统性能数据gopsutil库的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    逆天而行10942021-03-23
  • Golang一步步教你编写可测试的Go语言代码

    一步步教你编写可测试的Go语言代码

    相信每位编程开发者们应该都知道,Golang作为一门标榜工程化的语言,提供了非常简便、实用的编写单元测试的能力。本文通过Golang源码包中的用法,来学...

    tabalt4562020-05-04
  • Golanggolang不到30行代码实现依赖注入的方法

    golang不到30行代码实现依赖注入的方法

    这篇文章主要介绍了golang不到30行代码实现依赖注入的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    xialeistudio2002020-05-17
  • GolangGo语言开发框架反射机制及常见函数示例详解

    Go语言开发框架反射机制及常见函数示例详解

    这篇文章主要为大家介绍了Go语言开发框架反射机制及常见函数示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职...

    山与路7092022-11-22
  • GolangUbuntu下安装Go语言开发环境及编辑器的相关配置

    Ubuntu下安装Go语言开发环境及编辑器的相关配置

    这篇文章主要介绍了Ubuntu下安装Go语言开发环境及编辑器的相关配置,编辑器方面介绍了包括Vim和Eclipse,需要的朋友可以参考下 ...

    喝醉的毛毛虫5982020-04-29
  • GolangGoLang职责链模式代码实现介绍

    GoLang职责链模式代码实现介绍

    这篇文章主要介绍了GoLang职责链模式代码实现,职责链模式是一种常用的设计模式,可以提高代码的灵活性与可维护性,职责链模式将请求和处理分离,可...

    未来谁可知9692023-05-11
  • Golang在Go中使用Goroutines和Channels发送电子邮件

    在Go中使用Goroutines和Channels发送电子邮件

    本文中,我们将探讨如何使用Goroutines和Channels在Go中发送电子邮件。通过本教程的最后,您将对如何在Go应用程序中实现此功能有深入的了解。...

    技术的游戏8372024-01-02