Go语言time包实战:时间获取、转换与格式化详解

何川
何川
发布时间:2026-10-15| 7人浏览过
原创

在Go语言开发中,处理时间数据是高频需求。本文系统梳理time包的核心功能,从基础的时间获取到复杂的Unix时间戳转换,再到基于Add与AddDate的时间维度运算,最后深入解析Format与Parse函数中标志时间布局的特殊语法,帮助开发者构建准确可靠的时间逻辑。

获取时间与基础属性提取

time.Time类型是Go中表示时间的核心结构。开发者可通过time.Now()获取当前时刻的对象,随后调用其内置方法直接提取年、月、日、时、分、秒等离散数值。

package main
import (
	"fmt"
	"time"
)
func main() {
	now := time.Now()
	// 输出完整时间对象及各项属性
	fmt.Println(now)
	fmt.Println(now.Year(), now.Month(), now.Day())
	fmt.Println(now.Hour(), now.Minute(), now.Second())
}

Unix时间戳的处理与转换

Unix时间戳是指自1970年1月1日(UTC)以来的毫秒或秒数,常用于跨平台数据交换或日志记录。Go提供了多种精度级别的转换方法:

  • now.Unix():返回秒级整数。
  • now.UnixMilli():返回毫秒级整数。
  • now.UnixNano():返回纳秒级整数。

若需将时间戳还原为可读的时间对象,可使用time.Unix(sec, nsec),其中第二个参数用于补充纳秒信息。

unixTime := now.Unix()
convertedTime := time.Unix(unixTime, 0)
fmt.Println(convertedTime)

时间间隔类型与运算

time.Duration以纳秒为基本单位,可表示长达约290年的时间跨度。该类型内建了常用的时间常量,如time.Second、time.Hour等,便于直观表达持续时间。

在进行时间位移计算时,以下方法最为常用:
1. Add(d Duration):接受正负值Duration,分别实现加法或减法操作。
2. AddDate(years, months, days int):按年、月、日维度的日历逻辑进行增减,避免手动换算天数带来的误差。
3. Sub(t Time):计算两个时间点之间的差值,返回Duration类型。

第1步:执行时间加减操作

利用Add方法结合常量可以清晰地实现特定时间单位的偏移。例如将当前时间提前或延后一小时、十五分钟。

t := time.Now()

// 增加1小时
afterOneHour := t.Add(time.Hour * 1)

// 减少10秒钟
beforeTenSeconds := t.Add(-time.Second * 10)

// 增加1年零2个月
futureDate := t.AddDate(1, 2, 0)

第2步:便捷的时间差查询

在实际业务中,经常需要判断事件发生至今经过了多少时间,或距离未来某一刻还有多久。此时直接使用time.Since(t)和time.Until(t)比手动计算更简洁。

// 计算距t过去了多久
elapsed := time.Since(t)

// 计算距目标时刻t_future还有多久
remain := time.Until(t_future)

时间格式化与字符串解析

不同于其他语言使用占位符(如%Y-%m-%d),Go语言的time.Format使用了固定的参照时间作为模板。开发者只需记住Go语言的诞生时间:2006年1月2号 15点04分(星期一),对应的格式字符串即为"2006-01-02 15:04:05 Mon Jan"。

第3步:生成自定义时间字符串

根据需求选择对应的小时制(12/24小时制)。注意区分大小写,PM会触发12小时制模式,而pm无效。

now := time.Now()

// 24小时制格式
fmt.Println(now.Format("2006-01-02 15:04:05"))

// 12小时制格式(需包含PM)
fmt.Println(now.Format("2006-01-02 03:04:05 PM"))

// 纯日期格式
fmt.Println(now.Format("2006/01/02"))

第4步:解析带有时区的时间字符串

在使用time.Parse解析字符串时,如果源数据未显式声明时区,默认使用time.UTC。为确保本地时间计算的准确性,强烈建议使用time.ParseInLocation指定目标时区(如Asia/Shanghai)。

loc, _ := time.LoadLocation("Asia/Shanghai")
timeStr := "2023-08-15 14:30:00"
parsedTime, err := time.ParseInLocation("2006-01-02 15:04:05", timeStr, loc)
if err != nil {
    fmt.Println(err)
} else {
    fmt.Println(parsedTime)
}

以上就是GoLang Time时间操作函数讲解的详细内容,更多关于Go时间戳计算与格式化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。