找回密码
 立即注册
首页 业界区 业界 Golang基础笔记十一之日期与时间处理

Golang基础笔记十一之日期与时间处理

豌畔丛 2025-7-14 21:18:53
本文首发于公众号:Hunter后端
原文链接:Golang基础笔记十一之日期与时间处理
本篇笔记介绍 Golang 里日期与时间的处理,以下是本篇笔记目录:

  • 当前日期与时间的获取
  • 字符串与时间格式的互相转换
  • 时间戳与时间格式的互相转换
  • 日期与时间的加减
  • 星期数的获取
  • 定时器与计时器
1、当前日期与时间的获取

在 Golang 里,日期和时间处理都通过 time 包来实现。
如果我们想获取当前时间,我们可以使用 time.Now() 来操作:
  1. now := time.Now()
  2. fmt.Println(now)  // 2025-06-29 12:29:16.112605 +0800 CST m=+0.000154626
复制代码
如果我们想获取单独的年月日时分秒字段,可以使用下面的操作:
  1. now := time.Now()
  2. year, month, day := now.Date()
  3. hour, minute, second := now.Clock()
  4. fmt.Println(year, month, day)  // 2025 June 29
  5. fmt.Println(hour, minute, second)  // 15 29 50
复制代码
可以看到输出的月份是 June,但实际上月份是一个自定义的类型 Month,本质上也是一个 int 型数据,其源代码如下:
  1. type Month int
  2. const (
  3.     January Month = 1 + iota
  4.     February
  5.     March
  6.     April
  7.     May
  8.     June
  9.     July
  10.     August
  11.     September
  12.     October
  13.     November
  14.     December
  15. )
复制代码
所以,对于这里的年月日时分秒的单个变量,我们想将其组合输出为一般的 %Y-%m-%d %H:%M:%S 格式,可以如下操作:
  1. fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
复制代码
我们也可以分别单独获取对应的年月日时分秒数据:
  1. now := time.Now()
  2. fmt.Println(now.Year())
  3. fmt.Println(now.Month())
  4. fmt.Println(now.Day())
  5. fmt.Println(now.Hour())
  6. fmt.Println(now.Minute())
  7. fmt.Println(now.Second())
复制代码
2、字符串与时间格式的互相转换

1. 时间格式转字符串

在其他计算机语言中,如果想将时间字段转化为字符串,格式化的操作比如 Python,一般是类似于 %Y-%m-%d %H:%M:%S 这种,但是 Golang 里是一个特殊的格式化字段,为 2006-01-02 15:04:05。
Go 里对时间字段格式化的函数为 Format(),下面是将时间格式转为字符串的操作为:
  1. now := time.Now()
  2. fmt.Println(now.Format("2006-01-02 15:04:05")) // 2025-06-29 22:45:11
复制代码
当然,格式化操作也可以单独针对日期,或者时间,连接的符号也可以自定义:
  1. now := time.Now()
  2. fmt.Println(now.Format("2006/01/02"))  // 2025/06/29
  3. fmt.Println(now.Format("15:04:05"))  // 23:22:06
复制代码
2. 字符串转时间格式

字符串转时间格式使用 time.Parse() 函数,以下是一个测试:
  1. timeStr := "2025/06/29"
  2. t, err := time.Parse("2006/01/02", timeStr)
  3. if err != nil {
  4.     fmt.Println("str to time error: ", err)
  5. } else {
  6.     fmt.Println("str to time is: ", t)
  7. }
  8. // str to time is:  2025-06-29 00:00:00 +0000 UTC
复制代码
在这里 time.Parse() 返回两个字段,一个是转换后的时间字段,一个是转换过程中的错误。
上面是转换日期,转换时间也是一样的操作:
  1. timeStr = "20:24:24"
  2. t, err := time.Parse("15:04:05", timeStr)
  3. if err != nil {
  4.     fmt.Println("str to time error: ", err)
  5. } else {
  6.     fmt.Println("str to time is: ", t)
  7. }
  8. // str to time is:  0000-01-01 20:24:24 +0000 UTC
复制代码
而如果提供了错误的时间字符串,返回的 err 字段则不会为空,比如下面这个示例:
  1. timeStr := "2025/13/29"
  2. t, err := time.Parse("2006/01/02", timeStr)
  3. if err != nil {
  4.     fmt.Println("str to time error: ", err)
  5. } else {
  6.     fmt.Println("str to time is: ", t)
  7. }
  8. // str to time error:  parsing time "2025/13/29": month out of range
复制代码
3、时间戳与时间格式的互相转换

另一个在时间函数中常用到的用于转换的数据是时间戳,下面介绍一下时间戳与时间的互相转换。
1. 时间格式转换为时间戳

下面是时间格式转换为秒级的时间戳:
  1. now := time.Now()
  2. fmt.Println(now.Unix())  // 1751211429
复制代码
还有转换为毫秒,纳秒级的操作:
  1. now := time.Now()
  2. fmt.Println(now.UnixMilli())  // 1751211522339
  3. fmt.Println(now.UnixNano())  // 1751211522339955000
复制代码
2. 时间戳转换为时间格式

时间戳转换为时间格式的函数为 time.Unix():
  1. timestamp := 1751211429
  2. targetTime := time.Unix(int64(timestamp), 0)
  3. fmt.Println(targetTime)  // 2025-06-29 23:37:09 +0800 CST
复制代码
这里需要注意,输入的时间戳需要是 int64 类型,输入的第二个参数为纳秒值,如果不需要那么精细的话,传值为 0 即可。
4、日期与时间的加减

介绍日期与时间的加减,这里分为两部分来介绍,一部分是时分秒,一部分是年月日,他们分别用到的函数是 Add() 和 AddDate()。
1. Add()-时分秒的加减

time.Duration

Add() 函数的参数类型是 time.Duration,Duration 也是自定义的一个时间单位,一纳秒就是一个 Duration,它的类型是 int64,范围是:
[code]const (    minDuration Duration = -1
您需要登录后才可以回帖 登录 | 立即注册