
本文介绍如何使用 Go 的 time.Parse 准确解析 JavaScript new Date().toString() 输出的日期字符串(如 "Sat Aug 27 2016 17:07:43 GMT+1000 (AEST)"),并转换为符合 Go 标准时间格式(如 "2016-08-30 14:05:31.563336601 +1000 AEST")的 time.Time 类型,以便与 GORM 等 ORM 框架无缝协作。
本文介绍如何使用 go 的 `time.parse` 准确解析 javascript `new date().tostring()` 输出的日期字符串(如 `"sat aug 27 2016 17:07:43 gmt+1000 (aest)"`),并转换为符合 go 标准时间格式(如 `"2016-08-30 14:05:31.563336601 +1000 aest"`)的 `time.time` 类型,以便与 gorm 等 orm 框架无缝协作。
Go 的 time.Parse 不使用常见的 YYYY-MM-DD HH:mm:ss 等模板,而是基于一个固定参考时间 —— Mon Jan 2 15:04:05 MST 2006(即 Unix 时间戳 1136239445)。所有格式字符串都必须严格对应这一“魔数”布局。JavaScript Date.prototype.toString() 输出的格式(例如 "Sat Aug 27 2016 17:07:43 GMT+1000 (AEST)")可直接映射为:
const jsDateFormat = "Mon Jan 02 2006 15:04:05 GMT-0700 (MST)"
注意:
- Mon 对应星期缩写(如 Sat);
- Jan 对应月份缩写(如 Aug);
- 02 是带前导零的日期(27 → 27,非 027);
- 2006 是年份;
- 15:04:05 是 24 小时制时分秒;
- GMT-0700 表示时区偏移(+1000 会被正确识别);
- (MST) 是时区缩写占位符,实际可匹配 (AEST)、(PDT) 等任意括号内字符串。
✅ 正确解析示例:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
package main
import (
"fmt"
"time"
)
func main() {
jsStr := "Sat Aug 27 2016 17:07:43 GMT+1000 (AEST)"
t, err := time.Parse("Mon Jan 02 2006 15:04:05 GMT-0700 (MST)", jsStr)
if err != nil {
panic(err) // 或妥善处理错误,如返回 HTTP 400
}
// 转换为 Go 默认时间格式(兼容 GORM 存储)
formatted := t.Format("2006-01-02 15:04:05.000000000 -0700 MST")
fmt.Println(formatted) // 输出:2016-08-27 17:07:43.000000000 +1000 AEST
}
⚠️ 注意事项:
- 时区信息(GMT+1000 和 (AEST))会被完整解析并保留,time.Time 值已含正确本地时区,无需额外调用 In();
- 若前端可能发送不同语言环境的日期(如中文浏览器返回 "周六 8月 27 2016..."),则该方案不适用——务必确保前端统一使用 en-US 语言环境调用 new Date().toString(),或改用 ISO 8601 格式(推荐);
- 更健壮的生产实践是:前端改用 new Date().toISOString() 发送 2016-08-27T07:07:43.000Z,后端用 time.RFC3339 解析,完全规避本地化格式风险;
- GORM 本身支持 time.Time 类型直存,无需手动转字符串;只要解析成功得到 time.Time,即可直接赋值给 struct 字段,GORM 会自动按数据库类型(如 TIMESTAMP WITH TIME ZONE)处理。
总结:精准匹配 JS toString() 格式的关键在于使用正确的 Go 时间布局字符串 "Mon Jan 02 2006 15:04:05 GMT-0700 (MST)",解析后可自由 Format 或直接用于业务逻辑与数据库交互。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










