如何使用Go语言time包的Layout函数精确转换时间戳为日期格式?
- 内容介绍
- 文章标签
- 相关推荐
本文共计932个文字,预计阅读时间需要4分钟。
`Go` 的 `time.Unix()` 函数接受两个参数,第一个是自 Unix 纪元(1970年1月1日00:00:00 UTC)以来的秒数,第二个是纳秒数。很多人误将毫秒数当作秒数传递,导致结果为1970年的日期。例如,`time.Unix(1717027200000, 0)` 实际上是1717年,因为Go将其视为秒数。
- 毫秒时间戳要先除以 1000 得秒数,余数转纳秒:
time.Unix(ms/1000, (ms%1000)*1e6) - 用
time.UnixMilli()(Go 1.17+)更安全,直接接收毫秒:time.UnixMilli(1717027200000) - 低于 Go 1.17 的项目别自己手算,用
time.Unix(0, ms*int64(time.Millisecond))更可靠
time.Parse() 格式字符串写成常见日期样式就报错
time.Parse() 不认 "yyyy-MM-dd" 或 "%Y-%m-%d" 这类惯用写法 —— 它只认 Go 自己那套魔性 Layout,本质是用一个固定时间点 "Mon Jan 2 15:04:05 MST 2006" 的格式做模板。写错一位、多空格、少时区都会 panic。
本文共计932个文字,预计阅读时间需要4分钟。
`Go` 的 `time.Unix()` 函数接受两个参数,第一个是自 Unix 纪元(1970年1月1日00:00:00 UTC)以来的秒数,第二个是纳秒数。很多人误将毫秒数当作秒数传递,导致结果为1970年的日期。例如,`time.Unix(1717027200000, 0)` 实际上是1717年,因为Go将其视为秒数。
- 毫秒时间戳要先除以 1000 得秒数,余数转纳秒:
time.Unix(ms/1000, (ms%1000)*1e6) - 用
time.UnixMilli()(Go 1.17+)更安全,直接接收毫秒:time.UnixMilli(1717027200000) - 低于 Go 1.17 的项目别自己手算,用
time.Unix(0, ms*int64(time.Millisecond))更可靠
time.Parse() 格式字符串写成常见日期样式就报错
time.Parse() 不认 "yyyy-MM-dd" 或 "%Y-%m-%d" 这类惯用写法 —— 它只认 Go 自己那套魔性 Layout,本质是用一个固定时间点 "Mon Jan 2 15:04:05 MST 2006" 的格式做模板。写错一位、多空格、少时区都会 panic。

