
本文详解如何使用 Go 标准库的 time.Parse 和 Time.Unix() 方法,将形如 "1/2/2006, 15:04:05" 的自定义格式日期时间字符串安全、准确地转换为自 Unix 纪元(1970-01-01 00:00:00 UTC)起经过的秒数。
本文详解如何使用 go 标准库的 `time.parse` 和 `time.unix()` 方法,将形如 `"1/2/2006, 15:04:05"` 的自定义格式日期时间字符串安全、准确地转换为自 unix 纪元(1970-01-01 00:00:00 utc)起经过的秒数。
在 Go 中,将日期时间字符串转为 Unix 时间戳(单位:秒)是一个常见需求,例如用于日志分析、缓存过期控制或与后端 API 交互。Go 的 time 包提供了高度可控的解析机制——关键在于正确指定参考时间布局(layout),而非直接使用常见格式如 "YYYY-MM-DD HH:MM:SS"。
Go 使用一个固定的参考时间作为布局模板:
"Mon Jan 2 15:04:05 MST 2006",其对应数字为 01/02/2006, 15:04:05(注意月份、日期、小时均为单数字示例,不补零)。因此,对于输入格式 "1/2/2006, 15:04:05",对应的 layout 应为:
"1/2/2006, 15:04:05"
✅ 完整示例代码如下:
package main
import (
"fmt"
"log"
"time"
)
func main() {
input := "1/2/2006, 15:04:05"
// 使用与输入完全匹配的 layout 解析
t, err := time.Parse("1/2/2006, 15:04:05", input)
if err != nil {
log.Fatal("解析失败:", err)
}
// Unix() 返回自 Unix 纪元起的秒数(int64)和纳秒偏移(通常忽略)
seconds := t.Unix()
fmt.Printf("输入时间:%s\n", input)
fmt.Printf("对应 Unix 时间戳(秒):%d\n", seconds)
// 输出:输入时间:1/2/2006, 15:04:05 → 对应 Unix 时间戳(秒):1136214245
}⚠️ 注意事项:
- Layout 必须严格匹配:"1/2/2006" 表示“月/日/年”,不接受 "01/02/2006"(前导零);若输入含前导零(如 "01/02/2006"),layout 应改为 "01/02/2006"。
- 时区默认为本地时区:time.Parse 默认按本地时区解析。如需 UTC 或指定时区,建议用 time.ParseInLocation 并传入 time.UTC 或自定义 *time.Location。
- 错误处理不可省略:时间解析极易因格式偏差失败,务必检查 err,避免静默错误。
- Unix() 返回的是秒,非毫秒或纳秒:若需毫秒,可用 t.UnixMilli()(Go 1.17+);纳秒则用 t.UnixNano()。
总结:Go 中日期转秒的核心路径是 time.Parse(layout, s) → Time → Unix()。掌握 layout 的“魔数”含义(源于固定参考时间)、严格对齐输入格式、并妥善处理时区与错误,即可稳健实现任意自定义时间字符串到 Unix 秒级时间戳的转换。










