go语言中的时间time详解
作者:何人陪我共长生
这篇文章给大家介绍go语言中的时间time相关知识,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
Go 语言里处理时间主要靠标准库 time 包,核心就记住一个 time.Time 类型和一个特殊的格式化时间 2006-01-02 15:04:05,下面按常用场景拆开说。
核心概念
- time.Time:代表一个具体的时间点,包含年月日时分秒、纳秒和时区信息,所有时间操作都基于它。
- time.Duration:代表时间间隔,以纳秒为单位,可表示的最大时长约 290 年。常用常量有
time.Second、time.Minute、time.Hour等。 - 两种时间:墙钟时间(日常用的 12/24 小时制,受时区和夏令时影响)和单调时间(从进程启动开始计时,不受系统时间修改影响)。
time.Now()返回的结果里会包含这两部分。
时间
package main
import ("fmt")
import ("time")
func main() {
timeObj := time.Now()
fmt.Println(timeObj)
// 输出:2026-09-22 21:16:28.7889388 +0800 CST m=+0.000000001
} 获取年月日时分秒
package main
import ("fmt")
import ("time")
func main() {
timeObj := time.Now()
fmt.Println(timeObj)
// 输出:2026-09-22 21:16:28.7889388 +0800 CST m=+0.000000001
//获取年月日时分秒
year := timeObj.Year()
// 月份需要转化一下
month := int(timeObj.Month())
day := timeObj.Day()
hour := timeObj.Hour()
minute := timeObj.Minute()
second := timeObj.Second()
// 2026 9 22 21 20 42
fmt.Println(year,month,day,hour,minute,second)
} Format进行格式化
时间类型有一个自带的方法 Format 进行格式化,
需要注意的是Go语言中格式化时间模板不是常见的 Y-m-d H:M:S形式,
而是使用Go的诞生时间2006年1月2号15点04分(记忆口诀为20061234)
注意一下go语言中的小时
03时 表示12小时制
15时 表示24小时制
获取此时此刻的时间(24h制)
package main
import ("fmt")
import ("time")
func main() {
timeObj := time.Now()
// 年月日 使用-进行分割
timeStr := timeObj.Format("2006-01-02 15:04:05")
// 输出:2026-09-22 21:30:14 这样可以获取此时此刻的时间
fmt.Println(timeStr)
} package main
import ("fmt")
import ("time")
func main() {
// 1. 先获取当前时间对象
timeObj := time.Now()
// 格式为 年月日使用/斜杠进行区分
timeStr2 := timeObj.Format("2006/01/02 15:04:05")
// 输出: 2026/09/22 21:39:04 年月日使用/斜杠进行区分
fmt.Println(timeStr2)
} 获取指定时间(12h制)
package main
import ("fmt")
import ("time")
func main() {
// 1. 先获取当前时间对象
timeObj := time.Now()
// 格式为 年月日使用/斜杠进行区分
timeStr2 := timeObj.Format("2006/01/02 03:04:05")
// 2026/09/22 09:40:44
fmt.Println(timeStr2)
}
时间戳
间戳是自1970年1月1日(08:00:00GMT)至当前时间的总毫秒数。
它也被称为 Unix 时间戳(UnixTimestamp)。
package main
import ("fmt")
import ("time")
func main() {
timeObj := time.Now()
// 这个是毫秒级级别的
unixTime := timeObj.Unix()
// 获取时间戳: 1790084682
fmt.Println(unixTime)
// 获取纳秒级别的时间戳
unixNanoTime := timeObj.UnixNano()
fmt.Println(unixNanoTime)
// 输出的是: 1790085035764006000
} 将时间戳转换为年月日 时分秒
package main
import ("fmt")
import ("time")
func main() {
unixTime := 1790084682
// time.Unix的第一个参数是int 64位数的哈
timeObj := time.Unix(int64(unixTime), 0)
var stringTime = timeObj.Format("2006-01-02 15:04:05")
fmt.Println(stringTime)
}每间隔1s输出时间
package main
import ("fmt")
import ("time")
func main() {
// 表示每隔1s 执行一次,
ticker := time.NewTicker(time.Second)
for t := range ticker.C {
// 每间隔1s就会输出时间
fmt.Println("Tick at", t)
}
}避坑指南
- 时区:跨时区应用里,建议存储和传输用 UTC,展示时再转本地时区;用
time.LoadLocation加载具体时区。 - 格式混淆:别写成
"YYYY-MM-DD",Go 只认2006-01-02。 - Sleep 精度:
time.Sleep有调度延迟,实际等待时间可能偏长。需要精确超时控制时,优先用context.WithTimeout或context.WithDeadline。 - 并发安全:
time.Timer和time.Ticker在多 goroutine 下不是线程安全的,需要加锁或同步保护。 - 时间比较:判断两个时间是否相等用
Equal,别用==,可能因精度或时区问题出错。
到此这篇关于go语言中的时间time的文章就介绍到这了,更多相关go时间time内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
