time

Go语言的time包是处理日期和时间的核心库,提供了丰富的时间操作功能。

1 常量

  • 预定义布局

const (
	Layout      = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order.
	ANSIC       = "Mon Jan _2 15:04:05 2006"
	UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
	RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
	RFC822      = "02 Jan 06 15:04 MST"
	RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
	RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
	RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
	RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
	RFC3339     = "2006-01-02T15:04:05Z07:00"
	RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
	Kitchen     = "3:04PM"
	// Handy time stamps.
	Stamp      = "Jan _2 15:04:05"
	StampMilli = "Jan _2 15:04:05.000"
	StampMicro = "Jan _2 15:04:05.000000"
	StampNano  = "Jan _2 15:04:05.000000000"
	DateTime   = "2006-01-02 15:04:05"
	DateOnly   = "2006-01-02"
	TimeOnly   = "15:04:05"
)

​类别​

​常量​

​格式示例​

​使用场景​

​标准布局​

Layout

01/02 03:04:05PM '06 -0700

原生参考格式

​Unix格式​

ANSIC

Mon Jan _2 15:04:05 2006

Unix系统日志

UnixDate

Mon Jan _2 15:04:05 MST 2006

​RFC标准​

RFC822

02 Jan 06 15:04 MST

电子邮件/HTTP协议

RFC1123

Mon, 02 Jan 2006 15:04:05 MST

​ISO8601​

RFC3339

2006-01-02T15:04:05Z07:00

现代API/JSON数据交换

RFC3339Nano

2006-01-02T15:04:05.999Z07:00

高精度时间戳

​简写格式​

Kitchen

3:04PM

用户界面时间展示

​时间戳​

StampMicro

Jan _2 15:04:05.000000

微秒级日志记录

​分区格式​

DateOnly

2006-01-02

仅日期存储

TimeOnly

15:04:05

仅时间存储

参考时间​​:2006-01-02 15:04:05.999999999 -07:00

这是 Go 语言时间格式化的核心锚点时间,各字段含义:

  • 2006 → 年份模板(可简写为 06

  • 01 → 月份(数字)

  • 02 → 日

  • 15 → 24小时制小时(03表示12小时制)

  • 04 → 分钟

  • 05 → 秒

  • 999999999 → 纳秒

  • -07:00 → 时区偏移

时区说明​​:

  • -+开头:表示时区偏移,如"-0700"表示比UTC晚7小时。

  • Z开头:表示时区为UTC(即偏移0)。对于非UTC时区,将显示实际偏移,如"Z07:00"格式,当时间在UTC时显示为"Z",其他时区显示为"+07:00"或"-07:00"等。

  • 注意:布局字符串中的非参考时间部分(如固定文字)将被原样保留。

  • 持续时间常量

2 函数

2.1 func After(d Duration) <-chan Time

​作用​​:创建单次计时通道 ​​参数​​:

  • d Duration:等待时间(纳秒精度),负值被视为0 ​​返回值​​:只读时间通道(发送一次当前时间) ​​注意事项​​:

  • 通道不接收会导致计时器资源泄露

  • 多路径选择时用 select 避免阻塞

2.2 func Sleep(d Duration)

​作用​​:阻塞当前 goroutine ​​参数​​:

  • d Duration:休眠时间,负值被视为0 ​​返回值​​:无 ​​注意事项​​:

  • 实际休眠时间可能略长于指定值

  • 不可中断的阻塞操作

  • 在并发场景中考虑使用可中断方案

2.3 func Tick(d Duration) <-chan Time

​作用​​:创建周期计时通道 ​​参数​​:

  • d Duration:间隔时间,负值会panic ​​返回值​​:只读时间通道(周期性发送时间) ​​注意事项​​:

  • ​无法手动关闭​​,永久占用资源

  • 仅适用于程序生命周期内的任务

  • 有限任务请改用 time.NewTicker

3 类型

3.1 Duration

表示两个时间点之间经过的时间(纳秒计数)

​取值范围​​: 约 ±292 年(math.MinInt64math.MaxInt64 纳秒)

3.1.1 func ParseDuration(s string) (Duration, error)

​作用​​: 解析时间字符串为 Duration 类型 ​​参数​​:

  • s string: 时间描述字符串(支持单位:ns/µs/us/ms/s/m/h) ​​返回值​​:

  • Duration: 解析成功的时间段

  • error: 格式错误时返回非 nil

​错误情况​​:

  • 无效单位(如 1x

  • 非数字前缀(如 abc3s

  • 浮点数格式错误(如 1.2.3s

3.1.2 func Since(t Time) Duration

​作用​​: 计算当前时间与过去时间点 t 的差值 ​​参数​​:

  • t Time: 过去的时间点 ​​返回值​​:

  • Duration: t 到现在经过的时间(负值表示当前在 t 之前)

3.1.3 func Until(t Time) Duration

​作用​​: 计算当前时间到未来时间点 t 的剩余时间 ​​参数​​:

  • t Time: 未来的时间点 ​​返回值​​:

  • Duration: 现在到 t 的剩余时间(负值表示 t 是过去时间)

3.1.4 func (d Duration) Abs() Duration

作用​​: 返回持续时间的绝对值 ​​返回值​​:

  • Duration: 正数表示的时间段

3.1.5 单位转换方法集

​作用​​: 转换时间到各种单位 ​​返回值​​:

方法名
返回类型
说明

Hours()

float64

小时数

Minutes()

float64

分钟数

Seconds()

float64

秒数

Milliseconds()

int64

毫秒数

Microseconds()

int64

微秒数

Nanoseconds()

int64

纳秒数

3.1.6 func (d Duration) Round(m Duration) Duration

​作用​​: 四舍五入到指定单位 ​​参数​​:

  • m Duration: 基准时间单位(必须 > 0) ​​返回值​​:

  • Duration: 四舍五入后的时间

3.1.7 func (d Duration) Truncate(m Duration) Duration

​作用​​: 舍去小于基准单位的时间 ​​参数​​:

  • m Duration: 基准时间单位(必须 > 0) ​​返回值​​:

  • Duration: 截断后的时间

3.1.8 func (d Duration) String() string

​作用​​: 生成时间段的字符串表示 ​​返回值​​:

  • string: 人性化的时间描述

3.2 Location类型

time.Location 是 Go 语言中表示时区的核心类型

作用​​:

  • 表示特定地理位置的时区信息

  • 存储 UTC 偏移量和夏令时规则

  • 支持不同时区的时间转换

3.2.1 func FixedZone(name string, offset int) *Location

​作用​​:创建固定偏移量的时区 ​​参数​​:

  • name string:时区名称(自定义)

  • offset int:UTC 偏移秒数(正东负西) ​​返回值​​:*Location(固定偏移时区) ​​注意事项​​:

  • 不支持夏令时

  • 名称仅用于标识,不影响功能

  • 偏移量必须有效:-86400 < offset < 86400

3.2.2 func LoadLocation(name string) (*Location, error)

​作用​​:加载系统时区数据库 ​​参数​​:

  • name string:时区名称(如 "Asia/Shanghai") ​​返回值​​:

  • *Location:加载的时区

  • error:加载失败信息 ​​错误情况​​:

  • time: unknown time zone Asia/XXXXX(名称错误)

  • 找不到系统时区数据库(常见于容器环境)

  • 数据库格式损坏(概率极低)

3.2.3 func LoadLocationFromTZData(name string, data []byte) (*Location, error)

​作用​​:从原始数据加载时区 ​​参数​​:

  • name string:时区名称

  • data []byte:IANA 时区数据库内容 ​​返回值​​:

  • *Location:加载的时区

  • error:数据无效时报错 ​​注意事项​​:

  • 主要用于嵌入式系统或无 OS 时区场景

  • 数据需是完整的时区文件内容

  • 性能低于 LoadLocation

3.2.4 func (l *Location) String() string

​作用​​:获取时区名称 ​​返回值​​:

  • string:创建时指定的名称

3.3 Month类型

Month 类型用于表示月份,这是一个强类型定义,可以安全处理月份相关操作。

特点​​:

  • 实际存储为整数(1-12)

  • 定义有命名常量提高可读性

  • 内置字符串转换方法

  • 月份常量

3.3.1 func (m Month) String() string

​作用​​:将月份数字转换为对应的英文名称 ​​返回值​​:月份的英文全名(从 "January" 到 "December") ​​无效月份处理​​:

  • 有效范围 1-12(January=1 到 December=12)

  • 超出范围返回格式为 "Month(N)" 的字符串

3.4 Weekday类型

time.Weekday 是 Go 中表示星期几的类型,提供了强类型支持和便捷的字符串转换功能。

特性​​:

  • 使用 0 = Sunday6 = Saturday 的整数值表示

  • 提供命名常量增强可读性

  • 内置字符串转换方法

  • 星期常量

3.4.1 func (d Weekday) String() string

​作用​​:将星期数字转换为对应的英文名称 ​​返回值​​:星期的英文全名(如 "Sunday") ​​无效值处理​​:

  • 有效范围 0-6(Sunday-Saturday)

  • 超出范围返回格式为 "Weekday(N)" 的字符串

3.5 Ticker类型

time.Ticker 是 Go 语言中处理周期性任务的精妙工具。

核心特性​​:

  • 在指定时间间隔生成时间事件的计时器

  • 通过通道 C 发送时间值

  • ​单缓冲通道​​:每次只缓冲一个事件

  • 精确度受系统时间精度限制(通常 1-10ms)

3.5.1 func NewTicker(d Duration) *Ticker

  • 功能:构造Ticker结构体

  • 参数:d Duration:触发间隔时间 ​​必须 > 0​

  • 返回值:初始化后的定时器指针

  • 错误

    • d <= 0 时触发 ​​panic​​(程序崩溃)

3.5.2 func (t *Ticker) Reset(d Duration)

  • 功能:重置定时器

  • 参数:新的触发间隔 ​​必须 > 0​​

  • 注意事项

    • 重置前​​必须​​保证 t != nil

    • ​禁止​​在已停止的 Ticker 上调用 Reset(导致 panic)

    • 重置后立即生效,但​​不会清空​​已有事件

3.5.3 func (t *Ticker) Stop()

行为特性

  • 停止 Ticker 并释放相关资源

  • ​不会关闭​​通道 C

  • 停止后继续读取 C 会阻塞

  • 支持多次调用(安全无副作用)

3.6 Timer类型

time.Timer 是 Go 语言中处理单次延时任务的强大工具,提供了精确的时间控制和丰富的操作选项。

核心特性​​:

  • 用于表示单个定时事件的计时器

  • 一旦触发后通道只发送一次时间值

  • 可在触发前被停止或重置

  • ​停止后通道不会被关闭​

3.6.1 func NewTimer(d Duration) *Timer

  • 作用​​:创建新的计时器,在指定时间后发送当前时间到通道 C

  • 参数:等待时间 ​​必须 ≥ 0​

  • 返回值:初始化后的计时器指针

注意事项​​:

  • d = 0 时计时器会立即准备好(但需读取通道)

  • 创建后应立即处理资源释放(推荐 defer

3.6.2 func AfterFunc(d Duration, f func()) *Timer

  • 作用​​:在指定时间后在单独 goroutine 中执行函数

  • 参数

    • 等待时间 ​​必须 ≥ 0​

    • 到期后执行的函数

  • 返回值:计时器指针(可用于提前停止)

注意事项​​:

  • 执行环境在单独的 goroutine 中

  • 函数执行不阻塞原调用链

  • d = 0 时函数会立即在新 goroutine 中执行

3.6.3 func (t *Timer) Reset(d Duration) bool

  • 作用​​:重新设置计时器的到期时间

  • 参数:新的等待时间 ​​必须 ≥ 0​​

  • 返回值:是否重置成功(true=重置时计时器未触发)

关键规则​​:

  1. 当计时器已触发或已停止时,返回 false

  2. 当计时器未触发时,返回 true

  3. 对于已触发的计时器,需​​先处理通道值​​再重置:

3.6.4 func (t *Timer) Stop() bool

  • 作用​​:阻止计时器触发并释放资源

  • 返回值:是否成功停止(true=成功阻止触发)

关键规则​​:

  1. 停止已触发的计时器返回 false

  2. 停止已停止的计时器返回 false

  3. 停止后通道不会被关闭(未读取会阻塞)

  4. 停止成功后通道中不会有值发送

3.7 Time类型

time.Time是Go语言时间处理的核心类型,用于表示一个精确到纳秒的时间点。

3.7.1 func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time

​作用​​:手动创建具体时间 ​​参数​​:

  • year:年份(负数表示公元前)

  • month:月份(可使用 time.January 等常量)

  • day:日(1-31)

  • hour:小时(0-23)

  • min:分钟(0-59)

  • sec:秒(0-59)

  • nsec:纳秒(0-999999999)

  • loc:时区(time.UTCtime.Local 或自定义)

​返回值​​:构造的时间对象 ​​错误情况​​:

  • 月份不合法(<1或>12)

  • 日期超出月份范围

  • 时间分量超出范围

3.7.2 func Now() Time

​作用​​:获取当前时间(高精度) ​​特点​​:

  • 包含单调时钟(用于时间计算)

  • 时区为本地时区

3.7.3 func Parse(layout, value string) (Time, error)

​作用​​:按照布局解析时间字符串(默认UTC) ​​参数​​:

  • layout:时间格式(使用参考时间定义)

  • value:要解析的时间字符串

​返回值​​:

  • Time:解析成功的时间对象

  • error:格式不匹配时返回错误

​常见错误​​:

  • parsing time ...: extra text(有多余字符):需要所有格式一一对应

  • parsing time ...: month out of range

  • parsing time ...: unknown time zone ...

3.7.4 func ParseInLocation(layout, value string, loc *Location) (Time, error)

作用​​:在指定时区解析时间 ​​参数​​:

  • layout:时间格式

  • value:时间字符串

  • loc:指定时区

​与 Parse 区别​​:

  • 指定默认时区代替UTC

  • 字符串中无时区信息时使用指定时区

3.7.5 func Unix(sec int64, nsec int64) Time

​作用​​:从Unix时间戳创建时间 ​​参数​​:

  • sec:从1970-01-01 UTC开始的秒数

  • nsec:纳秒偏移(0-999999999)

​注意​​:

  • 结果时间固定为UTC时区

  • nsec 超出范围自动进位

3.7.6 func UnixMicro(usec int64) Time

​作用​​:从微秒级时间戳创建 ​​参数​​:

  • usec:从1970-01-01 UTC开始的微秒数

3.7.7 func UnixMilli(msec int64) Time

​作用​​:从毫秒级时间戳创建 ​​参数​​:

  • msec:从1970-01-01 UTC开始的毫秒数

3.7.8 func (t Time) Add(d Duration) Time

​作用​​:增加指定时间段 ​​参数​​:

  • d Duration:要添加的时间段(支持负值表示减少时间)

​返回值​​:计算后的新时间 ​​特点​​:

  • 支持纳秒级精度

  • 自动处理时区转换

  • 自动处理日期边界(如月末进位)

3.7.9 func (t Time) AddDate(years int, months int, days int) Time

​作用​​:增加年月日分量 ​​参数​​:

  • years:年数

  • months:月数

  • days:天数

​返回值​​:计算后的新时间 ​​特点​​:

  • 智能处理月份进位和月末情况

  • 时间分量保持不变

  • 支持负值减少时间

3.7.10 func (t Time) Sub(u Time) Duration

​作用​​:计算两个时间的差值 ​​参数​​:

  • u Time:要减去的时间

​返回值​​:时间段差值 (t - u)​特点​​:

  • 返回负值表示 t < u

  • 高精度(纳秒级)

  • 考虑单调时钟(精度更高)

3.7.11 func (t Time) Round(d Duration) Time

​作用​​:四舍五入到指定精度 ​​参数​​:

  • d Duration:时间精度(必须 > 0)

​返回值​​:舍入后的时间 ​​规则​​:

  • 默认使用单调时钟计时

  • 到零点的距离 >= 1/2 精度则进位

3.7.12 func (t Time) Truncate(d Duration) Time

​作用​​:截断到指定精度 ​​参数​​:

  • d Duration:时间精度(必须 > 0)

​返回值​​:截断后的时间 ​​特点​​:

  • 简单去除小数部分

  • 不会自动进位

  • 保持单调时钟

Go 语言中的时间比较方法提供精确的时序关系判断,这些方法都使用单调时钟保证精度,即使系统时间发生变化也能保持准确性。

3.7.13 func (t Time) After(u Time) bool

​作用​​:检查时间 t 是否在时间 u 之后 ​​返回值​​:如果 t > u 则为 true

3.7.14 func (t Time) Before(u Time) bool

​作用​​:检查时间 t 是否在时间 u 之前 ​​返回值​​:如果 t < u 则为 true

3.7.15 func (t Time) Equal(u Time) bool

​作用​​:检查两个时间是否相等 ​​返回值​​:如果 t == u 则为 true​特殊规则​​:

  • 比较时间点的纳秒级精度

  • 考虑时区位置(不同时区相同时刻可能不等)

  • 考虑单调时钟状态

3.7.16 func (t Time) Compare(u Time) int

​作用​​:三态比较两个时间(Go 1.20+) ​​返回值​​:

  • -1:如果 t < u

  • 0:如果 t == u

  • 1:如果 t > u

3.7.17 func (t Time) IsZero() bool

​作用​​:检查时间是否为零值 ​​零值定义​​:time.Time{} (year=1, month=1, day=1, UTC)

3.7.18 func (t Time) IsDST() bool

​作用​​:检查时间是否处于夏令时(Daylight Saving Time) ​​注意​​:结果取决于时区规则

3.7.19 func (t Time) Date() (year int, month Month, day int)

​作用​​:获取时间的年、月、日 ​​返回值​​:

  • year:年份(负数表示公元前)

  • month:月份对象(time.January 等)

  • day:月中天数(1-31)

3.7.20 func (t Time) Clock() (hour, min, sec int)

​作用​​:获取时分秒分量 ​​返回值​​:

  • hour:小时(0-23)

  • min:分钟(0-59)

  • sec:秒(0-59)

3.7.21 各时间分量独立获取​​

方法
返回值
范围
示例

Year()

int

年份

t.Year() → 2025

Month()

Month

月份对象

t.Month().String() → "June"

Day()

int

月中天数

t.Day() → 6

Weekday()

Weekday

星期

t.Weekday().String() → "Friday"

Hour()

int

小时

t.Hour() → 15

Minute()

int

分钟

t.Minute() → 30

Second()

int

t.Second() → 45

Nanosecond()

int

纳秒

t.Nanosecond() → 0

3.7.22 func (t Time) ISOWeek() (year, week int)

​作用​​:获取ISO周数和年份 ​​规则​​:

  • 每周从周一开始

  • 每年第一周包含至少4天

3.7.23 func (t Time) YearDay() int

​作用​​:获取年中天数(1-366) ​​闰年​​:2月29日为第60天

3.7.24 func (t Time) Zone() (name string, offset int)

​作用​​:获取时区信息 ​​返回值​​:

  • name:时区缩写(如"CST"、"EST")

  • offset:UTC偏移秒数(东正西负)

3.7.25 func (t Time) ZoneBounds() (start, end Time)

​作用​​:获取当前时区规则的有效时间范围(Go 1.21+) ​​返回值​​:

  • start:当前时区规则开始时间

  • end:当前时区规则结束时间

  • 如规则是固定偏移,则 start = -∞, end = +∞

3.7.26 func (t Time) Location() *Location

​作用​​:获取时间关联的时区 ​​返回值​​:*time.Location 指针 ​​特性​​:

  • 创建时间对象时设置的时区

  • 默认为 UTC(使用 time.Unix 创建时)

  • 可以来自 time.Local 系统本地时区

3.7.27 func (t Time) In(loc *Location) Time

​作用​​:将时间转换为指定时区的时间 ​​参数​​:

  • loc *Location:目标时区对象 ​​返回值​​:转换后的时间(相同时间点的新表示) ​​注意事项​​:

  • 传入 nil 会导致 panic

  • 转换精度到纳秒(不损失精度)

3.7.28 func (t Time) Local() Time

​作用​​:将时间转换为系统本地时区的时间 ​​返回值​​:本地时区时间 ​​特性​​:

  • 使用 time.Local 系统设置

  • 自动处理夏令时

3.7.29 func (t Time) UTC() Time

​作用​​:将时间转换为 UTC 时区时间 ​​返回值​​:UTC 时区的时间表示 ​​特点​​:

  • 清除本地时区信息

  • 国际数据交换标准格式

最佳实践建议​

  • ​服务层​​:始终使用 UTC 时间处理逻辑

  • ​存储层​​:所有时间戳用 UTC 存储

  • ​表示层​​:在最后一刻转换为本地时间

3.7.30 func (t Time) Format(layout string) string

​作用​​:按指定布局格式化时间为字符串 ​​参数​​:layout - 使用参考时间(2006-01-02 15:04:05)的格式 ​​返回值​​:格式化后的字符串 ​​特点​​:

  • 支持自定义时间显示格式

    • "2006-01-02 15:04-05.9999999 -0700"

    • 分别为年-月-日 时-分-秒.毫秒 时区

    • 毫秒可以用9/0,但9的逻辑为舍弃无用0,0会保留所有位数

  • 不会改变原时间值

  • 线程安全

3.7.31 func (t Time) AppendFormat(b []byte, layout string) []byte

​作用​​:高效地将时间追加到字节切片 ​​参数​​:

  • b:目标字节切片

  • layout:格式字符串 ​​返回值​​:新字节切片 ​​优势​​:

  • 零分配(无临时字符串)

  • Format + []byte() 快3-5倍

3.7.32 func (t Time) String() string

​作用​​:返回默认格式的字符串表示 ​​格式​​:2006-01-02 15:04:05.999999999 -0700 MST​特点​​:

  • 包含时区信息

  • 显示单调时钟(当存在时)

  • 适合调试日志

3.7.33 func (t Time) GoString() string

​作用​​:返回 Go 源码格式的时间表示 ​​格式​​:类似 time.Date(2025, 6, 6, 15, 30, 45, 123456789, time.UTC)​用途​​:

  • 调试输出

  • 测试用例

  • 错误消息

3.7.34 func (t Time) MarshalJSON() ([]byte, error)

​作用​​:序列化为 JSON(RFC3339格式) ​​格式​​:"2025-06-06T15:30:45.123456789Z"​规则​​:

  • 纳秒精度

  • 时区转换为 UTC

  • 始终包含 'Z' 后缀

3.7.35 func (t *Time) UnmarshalJSON(data []byte) error

​作用​​:从JSON反序列化(RFC3339) ​​支持格式​​:

  • RFC3339

  • RFC3339Nano

  • Unix时间戳数值(毫秒)

3.7.36 func (t Time) MarshalText() ([]byte, error)

​作用​​:序列化为 RFC3339 文本 ​​等同​​:与 MarshalJSON 相同但无引号

3.7.37 func (t *Time) UnmarshalText(data []byte) error

​作用​​:从 RFC3339 文本反序列化 ​​同​​:与 UnmarshalJSON 逻辑一致

最后更新于