在MySQL 时间“不正确”问题 - V2EX中,通过在 connection URL string 中显式地设置时区( serverTimezone=Asia/Shanghai )解决了问题。
但是我还是有很多疑问。为什么“在 connection URL string 中设置时区”会将所设置时区的时间存储到 MySQL ?到底是哪里进行这样的处理的?
以下是我查阅的一些资料:
1
yanyueio 2020-08-23 17:42:35 +08:00 1
reply: 到底哪里进行这样的处理。
国际化任务处理的时候,具体说就是时间处理。当我今天还在上海用中文时区,然后明天就到了西雅图用的美国西部时间。要在两个页面显示当地时间(从数据库读取出来的),那么要么 mysql 本身设置了统一的时区(通常 scm 不会给你权限重启 mysql),要么自己做好转换(通过连接字符串是一种补救措施)。 如果你的应用程序启动的时候和 mysql 启动时设置的时区是一样的,那么最好了,不用写 connection 参数,否则还是要告诉 mysql 我这边存进去的时间到底是什么时区的(否则一律按数据库的时区存,否则再读取出来就变味了)。 hope it helps. btw: jvm 启动时可以用 `java.util.TimeZone.setDefault(TimeZone.getTimeZone("UTC"));`设置时区。 |
2
skai0dev 2020-08-23 17:59:29 +08:00
** serverTimezone **:
Override detection/mapping of time zone. Used when time zone from server doesn't map to Java time zone from: https://dev.mysql.com/doc/connectors/en/connector-j-reference-configuration-properties.html |
3
JasonLaw OP @skai0dev #2 我有点不太理解“Override detection/mapping of time zone. Used when time zone from server doesn't map to Java time zone”,可以具体解释一下吗?谢谢。
|
4
JasonLaw OP @yanyueio #1
@skai0dev #2 通过 @palfortime 在“MySQL 时间“不正确”问题 - V2EX”的回答 - https://www.v2ex.com/t/700563#reply15,我明白了为什么“在 connection URL string 中设置时区”会将所设置时区的时间存储到 MySQL ?明白了到底是哪里进行这样的处理的?。 在 https://github.com/mysql/mysql-connector-j/blob/79a4336f140499bd22dd07f02b708e163844e3d5/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NativeProtocol.java#L2228 中,会获取到 connection URL string 中所设置的 serverTimezone,最后会设置 serverSession 的 serverTimeZone 。 |