Go 语言时间处理与转换实战:获取、时间戳互转及计算

Hazel
Hazel
发布时间:2026-10-15 | 5人浏览过
原创

掌握Go语言的time包是处理业务逻辑和时间记录的基础。本文将系统性地讲解如何获取当前时间及其组成部分、使用Add方法进行时间的提前或推后、解析时间字符串并转换为时间戳,以及如何将Unix时间戳格式化为易读的时间文本并计算时间段。

1. 获取当前时间与日期组件

在Go程序中,获取当前时间最直接的方式是使用 time.Now()。该方法返回一个 Time 结构体对象,我们可以通过调用该对象的不同方法来提取具体的年、月、日、时、分、秒甚至纳秒信息。

第1步:定义主函数并导入模块

目的:建立执行环境。

  • 入口:新建文件(如 main.go)。
  • 动作:导入标准库 fmt 用于打印,time 用于时间处理。
  • 代码示例
package main

import (
	"fmt"
	"time"
)

func main() {
	// ... 后续步骤
}

第2步:获取时间详细信息

目的:提取时间各个维度的数值。

  • 操作:调用 time.Now() 及其方法。
  • 关键参数:.Year(), .Month(), .Day(), .Hour(), .Minute(), .Second(), .Nanosecond()。
func main() {
	currentTime := time.Now()

	currentYear := currentTime.Year()
	currentMonth := currentTime.Month()
	currentDay := currentTime.Day()
	currentHour := currentTime.Hour()
	currentMinute := currentTime.Minute()
	currentSecond := currentTime.Second()
	currentNSecond := currentTime.Nanosecond()

	fmt.Println("当前时间是:", currentTime)
	fmt.Printf("年: %d, 月: %v, 日: %d\n", currentYear, currentMonth, currentDay)
	fmt.Printf("时: %d, 分: %d, 秒: %d, 纳秒: %d\n", currentHour, currentMinute, currentSecond, currentNSecond)
}

结果验证:运行代码后,控制台将输出当前的完整时间字符串(如 2023-10-27 10:30:00 +0800 CST),以及分离出的整数型年月日和浮点型/整数型的时分秒数。

2. 时间点的加减运算

当需要计算“过去”或“未来”的时间点时,可以使用 Add 方法配合持续时间(time.Duration)。持续时间可以通过字符串解析获得,支持时(h)、分(m)、秒(s)等单位。

第3步:解析持续时间

目的:将人类可读的时间描述转换为Go内部的Duration类型。

  • 工具:time.ParseDuration(s string)。
  • 注意:字符串需符合标准格式,例如 "-1m" 表示1分钟前,"1h" 表示1小时后。负数代表往前推,正数代表往后推。
// 解析1分钟前的持续时间
m, _ := time.ParseDuration("-1m")
// 解析1小时后的持续时间
h, _ := time.ParseDuration("1h")

第4步:计算目标时间

目的:获取相对当前时间偏移后的具体时间。

  • 入口:time.Time 对象的 Add 方法。
  • 动作:targetTime := currentTime.Add(duration)。
func main() {
	currentTime := time.Now()
	
	// 获取1分钟之前的时间
	durationMinus, _ := time.ParseDuration("-1m")
	pastTime := currentTime.Add(durationMinus)
	fmt.Println("1分钟前的时间:", pastTime)
	
	// 获取1小时之后的时间
	durationPlus, _ := time.ParseDuration("1h")
	futureTime := currentTime.Add(durationPlus)
	fmt.Println("1小时后的时间:", futureTime)
}

3. 时间戳与时间的相互转换

在存储数据或与前端交互时,通常需要使用 Unix 时间戳(秒级或纳秒级)。本节介绍如何从时间对象生成时间戳,以及如何根据时间戳还原时间和格式化显示。

第5步:获取 Unix 时间戳

目的:将当前时间转换为整数形式的 Epoch 时间。

  • 秒级时间戳:time.Unix() 或直接调用 t.Unix()。
  • 纳秒级时间戳:调用 t.UnixNano()。
func main() {
	now := time.Now()
	timestamp := now.Unix()          // 秒
	nanoTimestamp := now.UnixNano()  // 纳秒
	fmt.Println("秒级时间戳:", timestamp)
	fmt.Println("纳秒级时间戳:", nanoTimestamp)
}

第6步:特定日期时间转为时间戳

当需要将自定义的年月日时分秒转换为时间戳时,使用 time.Date() 构造函数。

  • 语法:time.Date(year, month, day, hour, min, sec, nsec, loc TimeLocation)。
  • 参数:最后一个是时区,通常使用 time.Local(本地时区)或 time.UTC。
func main() {
	// 指定时间为 2021年11月20日 23:34:10 (本地时区)
	t := time.Date(2021, 11, 20, 23, 34, 10, 0, time.Local)
	ts := t.Unix()
	fmt.Println("指定时间的时间戳:", ts)
}

另一种方法:解析时间字符串

如果已知时间字符串(如 "2006-01-02 15:04:05"),可以使用 time.ParseInLocation:

layout := "2006-01-02 15:04:05"
timeVal, _ := time.ParseInLocation(layout, "2021-11-20 23:34:10", time.Local)
fmt.Println(timeVal.Unix())

第7步:Unix 时间戳转可读时间字符串

目的是将服务器端存的数字时间戳展示给用户。

  • 核心原则:Go语言的时间布局模板必须固定为 Mon Jan 2 15:04:05 MST 2006,即特定的参考日期。因此格式化模板应写作 "2006-01-02 15:04:05"。
func main() {
	timestamp := time.Now().Unix()
	layout := "2006-01-02 15:04:05"
	
	// 将时间戳转为 Time 对象,再 Format
	resStr := time.Unix(timestamp, 0).Format(layout)
	fmt.Println("格式化后的时间:", resStr)
}

4. 计算时间差

在实际场景中,常需计算两个时间点相隔多久(如订单过期时长)。Go 提供了 Sub() 方法来计算两个 Time 对象的差值,返回类型为 Duration。

第8步:计算两个时间之差

目的:获取两个时刻之间的间隔。

  • 公式:diff := timeOne.Sub(timeTwo)。
  • 说明:diff 是一个正数或负数的 Duration,正值表示 timeOne 晚于 timeTwo。
func main() {
	currentTime := time.Now()
	
	// 假设 timeOne 是 1小时前的时间,timeTwo 是 1小时后的时间
	tOne, _ := time.ParseDuration("-1h")
	timeOne := currentTime.Add(tOne)
	
	tTwo, _ := time.ParseDuration("1h")
	timeTwo := currentTime.Add(tTwo)
	
	// 计算差值
	diff := timeOne.Sub(timeTwo) // 结果为负值,因为 timeOne 早于 timeTwo
	
	fmt.Println("时间差总时长:", diff)
	fmt.Printf("相差分钟数: %.2f\n", diff.Minutes())
	fmt.Printf("相差小时数: %.2f\n", diff.Hours())
	fmt.Printf("相差天数: %.4f\n", diff.Hours()/24)
}

总结

通过上述操作,您可以熟练地在 Go 语言中进行时间的各种处理:利用 time.Now() 监控系统状态,利用 Add 和 ParseDuration 调度任务,利用 Unix() 和 Format() 进行数据持久化与日志显示。理解 time 包的方法链调用是提升开发效率的关键。以上就是 Golang 时间处理与转换实例代码的详细内容,更多关于 Golang 时间操作的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表