Go 中日期和时间处理简介
日期和时间处理是任何严肃应用程序中的关键任务之一。无论是事件日志记录、超时计算、日程安排还是时间序列分析,Go 语言都在其标准包 time 中提供了强大而优雅的工具集。在本文中,我们将全面解析 Go 中的日期和时间处理:从创建时间对象到复杂的时区和定时器操作。
基础:time.Time 结构与日期创建
time 包的核心元素是 time.Time 结构体。它表示一个具有纳秒精度和时区信息的时间点。
获取当前时间
最常见的场景是获取当前时刻:
package main
import ( "fmt" "time")
func main() { now := time.Now() fmt.Println("当前时间:", now)}创建特定日期
使用 time.Date() 函数创建日期。请注意:在 Go 中,月份通过常量(time.January、time.February 等)或数字 1 到 12 来指定。
func main() { // 2025年3月15日,14:30:00,UTC specificDate := time.Date(2025, time.March, 15, 14, 30, 0, 0, time.UTC) fmt.Println("特定日期:", specificDate) // 创建带纳秒的日期 preciseDate := time.Date(2025, 3, 15, 14, 30, 0, 123456789, time.UTC) fmt.Println("精确日期:", preciseDate)}日期格式化与解析
Go 使用独特的格式化方法:不是使用 %Y-%m-%d 这样的代码,而是使用参考时间 Mon Jan 2 15:04:05 MST 2006(可解读为 01 02 03 04 05 06 07——月、日、时、分、秒、年)。
格式化(time → 字符串)
Format() 方法根据给定的模板将时间转换为字符串:
func main() { now := time.Now() // 标准格式 fmt.Println("RFC3339:", now.Format(time.RFC3339)) fmt.Println("日期:", now.Format("2006-01-02")) fmt.Println("时间:", now.Format("15:04:05")) fmt.Println("完整格式:", now.Format("02.01.2006 15:04:05")) fmt.Println("带星期:", now.Format("Mon, 02 Jan 2006"))}解析(字符串 → time.Time)
time.Parse() 函数将字符串解析为时间结构体。重要提示:模板必须与输入字符串的格式完全匹配。
func main() { // 解析已知格式 dateStr := "2025-03-15 14:30:00" parsed, err := time.Parse("2006-01-02 15:04:05", dateStr) if err != nil { panic(err) } fmt.Println("解析结果:", parsed) // 带时区的解析 dateWithZone := "2025-03-15T14:30:00+03:00" parsedWithZone, _ := time.Parse(time.RFC3339, dateWithZone) fmt.Println("带时区:", parsedWithZone)}时间运算:间隔与比较
time 包提供了 Duration 类型来表示时间间隔,以及用于算术运算的方法。
加法和减法
func main() { now := time.Now() // 增加 2 小时 30 分钟 future := now.Add(2*time.Hour + 30*time.Minute) fmt.Println("2.5 小时后:", future) // 减去 7 天 past := now.Add(-7 * 24 * time.Hour) fmt.Println("一周前:", past) // 使用 AddDate 处理日历日期 nextMonth := now.AddDate(0, 1, 0) fmt.Println("一个月后:", nextMonth)}计算日期之间的差值
Sub() 方法返回 Duration:
func main() { start := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC) end