Go 中的日期和时间处理:从基础到高级技术

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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                

博客

书籍推荐