
本文介绍如何将 JSON 中以字符串形式存储的 Unix 时间戳(如 "1490846400")安全、高效地解析为 Go 的 time.Time 类型,提供可复用的转换函数及关键注意事项。
本文介绍如何将 json 中以字符串形式存储的 unix 时间戳(如 "1490846400")安全、高效地解析为 go 的 `time.time` 类型,提供可复用的转换函数及关键注意事项。
在 Go 的实际开发中(尤其是处理外部 JSON API 或配置文件时),常会遇到时间字段被序列化为纯数字字符串的 Unix 时间戳(单位:秒),例如 "1490846400"。由于 Go 的 encoding/json 包默认无法自动将字符串转为 time.Time(除非自定义 UnmarshalJSON 方法),我们需要手动完成字符串 → 整数 → time.Time 的转换。
核心思路是:先将字符串解析为 int64,再调用 time.Unix(sec, 0) 构造时间值(纳秒部分设为 0)。标准库未提供开箱即用的封装函数,但实现简洁可靠:
import (
"strconv"
"time"
)
func stringToTime(s string) (time.Time, error) {
sec, err := strconv.ParseInt(s, 10, 64)
if err != nil {
return time.Time{}, err // 返回零值 time.Time 和具体错误
}
return time.Unix(sec, 0), nil
}✅ 使用示例:
将任意网站转换为文件系统,自动抓取网站并将页面挂载为 Markdown 文件,可使用 grep、diff、cat 等标准 Unix 命令进行搜索、比较、读取和浏览。
t, err := stringToTime("1490846400")
if err != nil {
log.Fatal(err)
}
fmt.Println(t) // 输出:2017-03-30 04:00:00 +0000 UTC⚠️ 注意事项:
- 输入字符串必须仅含有效十进制整数,不可含空格、前导零(如
"01490846400"会导致ParseInt失败)或小数点; - 若时间戳单位为毫秒(常见于 JavaScript),需先除以 1000 并处理余数:
time.Unix(sec/1000, (sec%1000)*1e6); - 在结构体 JSON 解析场景中,推荐为字段定义自定义类型并实现
UnmarshalJSON方法,以实现透明转换; - 始终检查
error,避免静默失败导致后续逻辑使用无效时间。
该方法轻量、无依赖、符合 Go 的显式错误处理哲学,是处理字符串型 Unix 时间戳的标准实践。

















