Golang time 包常用方法与时间转换详解
在 Golang 开发中,时间处理是高频场景。所有的时间格式转换,包括时间戳与字符串之间的相互转化,均需以 time.Time 类型作为中间核心对象。本文将详细解析如何获取当前或指定时间、进行 Unix 时间戳转换、字符串格式化解析,以及时间的加减运算和逻辑判断。
准备条件
Golang 标准库内置了强大的 time 包,无需额外安装第三方依赖即可直接使用。核心操作围绕 time.Time 结构体展开,它是连接不同时间表现形式(如 UTC 本地时间、Unix 时间戳、自定义格式字符串)的桥梁。
核心操作方法
第一步:获取当前时间与指定时间
目的:获取系统当前的准确时间或构造一个特定的时间点。
操作:
- 获取当前时间:调用
time.Now(),返回值类型为time.Time。
t1 := time.Now()
fmt.Println(t1, reflect.TypeOf(t1))
- 构造指定时间:使用
time.Date()函数,按顺序传入年、月、日、时、分、秒、纳秒和时区。
t4 := time.Date(2019, 9, 30, 14, 28, 26, 23, time.Local) // 返回 time.Time
fmt.Println(t4)
第二步:Unix 时间戳与 time.Time 的互转
目的:实现 Unix 时间戳(秒/纳秒)与 Go 标准时间对象的转换。
操作:
- time.Time 转时间戳:直接调用实例方法
.Unix()(秒)或.UnixNano()(纳秒)。
t1 := time.Now()
t1Second := t1.Unix() // 获取秒级时间戳
t1Nano := t1.UnixNano() // 获取纳秒级时间戳
- 时间戳转 time.Time:使用
time.Unix(sec, nsec)。
timeStamp := 1569826535
t := time.Unix(int64(timeStamp), 0) // 转换为 time.Time 对象
第三步:时间字符串的解析与格式化
目的:将可读的时间字符串转换为时间对象,或将时间对象输出为指定格式的字符串。
关键规则:Golang 使用特定参照时间 Mon Jan 2 15:04:05 MST 2006(即 2006-01-02 15:04:05)作为格式化模板。无论中文还是英文表述,模板中的数字必须严格对应此基准时间。
- 字符串转 time.Time:使用
time.Parse(layout, value)。
s := "2019年9月30日 15:10:30"
t, err := time.Parse("2006年1月2日 15:4:5", s)
if err != nil {
fmt.Println(err.Error())
}
// 建议统一转换为标准 ISO 格式以便后续处理
result := t.Format("2006-01-02 15:04:05")
fmt.Println(result)
注意:输入字符串的格式结构必须与布局模板(Layout)完全一致。例如,若输入为 2019-09-30 15:12:14,则模板应写为 2006-01-02 15:04:05。
- time.Time 转字符串:使用
.Format(layout)方法。
strTime := t.Format("2006-01-02 15:04:05")
fmt.Println(strTime) // 输出示例: 2019-09-30 14:55:35
第四步:时间信息的提取
目的:从 time.Time 对象中分离出年的、月的、日的等具体数值。
操作:先将任意时间源(如时间戳)转为 time.Time,再调用相关方法。
t := time.Unix(int64(1569826535), 0)
// 批量获取
year, month, day := t.Date()
hour, minute, second := t.Clock()
// 单独获取各字段及星期信息
fmt.Println(t.Year(), t.Month(), t.Day())
fmt.Println(t.Hour(), t.Minute(), t.Second())
fmt.Println(t.Weekday(), t.YearDay()) // 星期几,一年中的第几天
第五步:时间的加减运算
目的:计算过去或未来的某个时间点。
操作:
- 按时间段加减:使用
.Add(duration),支持负数表示减法。
t := time.Unix(int64(1569826535), 0)
// 减去24小时
t3 := t.Add(-time.Hour * 24)
fmt.Println(t3.Format("2006/01/02 15:04:05"))
- 按日期组件加减:使用
.AddDate(years, months, days),适用于精确到年月日的操作。
// 减去1个月
T2 := t.AddDate(0, -1, 0)
fmt.Println(t2.Format("2006/01/02 15:04:05"))
第六步:时间大小的比较
目的:判断两个时间点的先后关系或是否相等。
操作:确保对比双方均为 time.Time 类型,返回布尔值。
t := time.Unix(int64(1569826535), 0)
b1 := t.After(time.Now()) // 判断t是否在time.Now()之后
b2 := t.Before(time.Now()) // 判断t是否在time.Now()之前
b3 := t.Equal(t) // 判断t是否与自身相等
fmt.Println(b1, b2, b3)
完成判断
通过以上步骤,即可完成从时间获取、格式转换、算术运算到逻辑比较的全流程处理。核心在于始终将数据转化为 time.Time 对象进行操作,利用其内置方法保证类型安全与准确性。
简要总结
以上就是 Golang time 包常用方法及时间转换的详细内容,更多关于 Go 语言时间处理与时间戳转换的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









