关于 golang mysql 驱动 parseTime 的设计感觉有点奇怪

1 天前
 javalaw2010

众所周知:parseTime 参数为 true 时,驱动会将 date/datetime/timestamp 类型根据 loc 时区解析成 time.Time 类型之后再返回。

timestamp 类型字段没什么疑议,本身底层是一个 unix 时间戳。

但是 date/datetime 类型本身只是一种时间表达方式。假设我有两条数据,虽然可能存储的都是“2025-09-19 14:44:00”的时间,但是业务层面,有可能一条的时区是 Asia/Shanghai, 另一条的时区是 Asia/Tokoyo ,我认为这个地方更适合交由业务层自行处理啊,如果用上 time.Time ,时区就会非常混乱,这里面会涉及到存储时的时区/数据库时区/服务器时区/DSN 中的 LOC 时区,非常折磨人啊。驱动也不提供单独解析 timestamp 类型的能力。

579 次点击
所在节点    Go 编程语言
3 条回复
Ketteiron
1 天前
别瞎搞这些有的没的。
服务器和数据库统一使用 UTC ,时间戳展示交给客户端。
datetime 没有时区,因此不建议用于有时区要求的场景。
如果想用 datetime 处理,设计接口时要额外传输时区信息,然后服务端转换成 UTC 时间,请求数据时转换成 Unix 让客户端自行处理。
当然这里存在一个问题,服务端完全丢失了该条数据的时区信息,如果业务有需要,再增加一个 timezone 字段。
lysShub
12 小时 35 分钟前
time.Time 带有时区的

我司强制要求存 stamp, 非要存时区单独开个字段
bbbblue
5 小时 42 分钟前
你想用的 timestamp 估计也会有问题。。。mysql 的 timestamp 是受到 session 的 timezone 影响的。。他虽然内部存时间戳 但是会根据 session 设置的 timezone 来处理它。。。

go 不知道 js 和 java 都是 数据库驱动如果没正确设置时区 timestamp 就炸了
java 侧是需要保证服务器时区和驱动时区能对上(可以把 session 改为服务器时区 或者 local+force)
js 侧的 mysql2 是要填入 session 的时区

直接存时间戳(我是指数字)得了


这点不如 pg 有个 timestamptz 啥问题都没有

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1160512

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX