Java 使用 LocalDateTime 存储时间导致快 8 小时

2019-04-23 15:18:45 +08:00
 rizon

java 程序运行环境是 CST 时区,mysql 服务是 UTC 时区。存储数据时,Date 类型存储会减去 8 小时,LocalDateTime 存储会按照 CST 直接存储。
问题 1: 那么在不修改环境时区的情况下,这两种存储按说哪个是对的?

问题 2: 现在读取时 Date 格式的展示正确,LocalDateTime 展示时会再加上 8 小时导致时间快 8 小时。怎么正确的解决这个问题。。

问题 3: 马上要用了,怎么快速的修复这个问题???

12912 次点击
所在节点    程序员
22 条回复
airfling
2019-04-23 15:21:44 +08:00
统一时区,就这样
coolyujiyu
2019-04-23 15:28:22 +08:00
你自己是什么时区,就都统一为什么时区,配置运行环境,甚至早过于你编码
rizon
2019-04-23 15:30:58 +08:00
@airfling #1
@coolyujiyu #2

是应该统一时区,统一之后就没问题了。可是我好奇的是,这个现象。
为什么在时区不一样的时候,存的时候一个会直接存一个会减 8 而展示的时候又为啥都加了 8 ??
lihongjie0209
2019-04-23 15:35:20 +08:00
LocalDateTime 没有时区这个概念, 只是一个对于时间的表示

如果要时区,那么使用 ZonedDateTime
zhfish
2019-04-23 15:36:29 +08:00
这个是 mysql connector 搞的鬼吧,本意是要自动处理时区问题
你也可以加参数忽略时区

不管是主机环境还是 docker 环境,都要注意时区的
zhfish
2019-04-23 15:36:54 +08:00
@lihongjie0209 说的对,其实和 LocalDateTime 没什么关系
learnshare
2019-04-23 15:37:33 +08:00
展示的时候进行了格式化,时区又一次产生了影响
chendy
2019-04-23 15:39:47 +08:00
还要看数据库字段用的啥,以及转换的代码怎么写的(或者用的什么框架 /工具)
java 的 Date,数据库的 Timestamp 本质上是时间戳,时区不同展现不同
java 的 LocalDateTIme,数据库的 DateTime,是写死的日期时间,怎么看都一样
数据库的时区和客户端的时区不同其实并没有太大问题,转换的逻辑没写错就是
FrankFang128
2019-04-23 15:42:25 +08:00
ISO 8601 了解一下,存绝对时间,JSON 里面用 ISO 8601
sonyxperia
2019-04-23 15:42:45 +08:00
LocalDateTime 表示这锅不背
DarrenLuo
2019-04-23 15:44:04 +08:00
数据库连接字符串里加上 timezone=utc,这样 mysql 驱动会在存储的时候处理为 utc 时间,取出来的时候按机器的时区取出来
broadliyn
2019-04-23 15:51:08 +08:00
1. 首先要看你 java 这边用的持久框架是什么,mybatis 或者是其他?
2. 你的 mysql 驱动版本号是?
gaius
2019-04-23 15:56:53 +08:00
应该是你设置了 jdbc 连接的时区是+8,但是数据库是+0,而且数据库存储时间的那个类型是支持时区的。
yangbai
2019-04-23 16:00:08 +08:00
LocalDateTime Date 存的都是 UTC 的绝对时间戳,输出出来想怎么格式化看你的使用和环境
octocatami
2019-04-23 16:00:33 +08:00
注意操作系统时区
ARhen
2019-04-23 16:01:45 +08:00
之前就因为没统一时区导致爬虫判断发布时间出错了 //..//
Cat73
2019-04-23 16:02:05 +08:00
我们是所有地方统一 UTC 时间的,展示的地方自己去格式化
rizon
2019-04-23 17:17:59 +08:00
@Cat73 #17 嗯哼~看到一个萌妹子老乡唉~ 有在打算回去工作呢。 互链 blog 吗~~ https://rizon.top
JasonP
2019-04-23 17:28:28 +08:00
是存到数据库保存的时间和 应用中的时间不一致么?可能是因为数据库连接没有配置 serverTimezone。
ourslay
2019-04-23 17:51:32 +08:00
ORM 用的什么?
MySQL 版本多少?

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

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

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

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

© 2021 V2EX