V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rizon
V2EX  ›  程序员

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

  •  
  •   rizon ·
    othorizon · 2019-04-23 15:18:45 +08:00 · 12632 次点击
    这是一个创建于 1792 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    22 条回复    2019-04-24 15:51:43 +08:00
    airfling
        1
    airfling  
       2019-04-23 15:21:44 +08:00
    统一时区,就这样
    coolyujiyu
        2
    coolyujiyu  
       2019-04-23 15:28:22 +08:00
    你自己是什么时区,就都统一为什么时区,配置运行环境,甚至早过于你编码
    rizon
        3
    rizon  
    OP
       2019-04-23 15:30:58 +08:00
    @airfling #1
    @coolyujiyu #2

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

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

    不管是主机环境还是 docker 环境,都要注意时区的
    zhfish
        6
    zhfish  
       2019-04-23 15:36:54 +08:00
    @lihongjie0209 说的对,其实和 LocalDateTime 没什么关系
    learnshare
        7
    learnshare  
       2019-04-23 15:37:33 +08:00
    展示的时候进行了格式化,时区又一次产生了影响
    chendy
        8
    chendy  
       2019-04-23 15:39:47 +08:00
    还要看数据库字段用的啥,以及转换的代码怎么写的(或者用的什么框架 /工具)
    java 的 Date,数据库的 Timestamp 本质上是时间戳,时区不同展现不同
    java 的 LocalDateTIme,数据库的 DateTime,是写死的日期时间,怎么看都一样
    数据库的时区和客户端的时区不同其实并没有太大问题,转换的逻辑没写错就是
    FrankFang128
        9
    FrankFang128  
       2019-04-23 15:42:25 +08:00
    ISO 8601 了解一下,存绝对时间,JSON 里面用 ISO 8601
    sonyxperia
        10
    sonyxperia  
       2019-04-23 15:42:45 +08:00
    LocalDateTime 表示这锅不背
    DarrenLuo
        11
    DarrenLuo  
       2019-04-23 15:44:04 +08:00 via Android
    数据库连接字符串里加上 timezone=utc,这样 mysql 驱动会在存储的时候处理为 utc 时间,取出来的时候按机器的时区取出来
    broadliyn
        12
    broadliyn  
       2019-04-23 15:51:08 +08:00   ❤️ 1
    1. 首先要看你 java 这边用的持久框架是什么,mybatis 或者是其他?
    2. 你的 mysql 驱动版本号是?
    gaius
        13
    gaius  
       2019-04-23 15:56:53 +08:00
    应该是你设置了 jdbc 连接的时区是+8,但是数据库是+0,而且数据库存储时间的那个类型是支持时区的。
    yangbai
        14
    yangbai  
       2019-04-23 16:00:08 +08:00
    LocalDateTime Date 存的都是 UTC 的绝对时间戳,输出出来想怎么格式化看你的使用和环境
    octocatami
        15
    octocatami  
       2019-04-23 16:00:33 +08:00
    注意操作系统时区
    ARhen
        16
    ARhen  
       2019-04-23 16:01:45 +08:00
    之前就因为没统一时区导致爬虫判断发布时间出错了 //..//
    Cat73
        17
    Cat73  
       2019-04-23 16:02:05 +08:00
    我们是所有地方统一 UTC 时间的,展示的地方自己去格式化
    rizon
        18
    rizon  
    OP
       2019-04-23 17:17:59 +08:00
    @Cat73 #17 嗯哼~看到一个萌妹子老乡唉~ 有在打算回去工作呢。 互链 blog 吗~~ https://rizon.top
    JasonP
        19
    JasonP  
       2019-04-23 17:28:28 +08:00
    是存到数据库保存的时间和 应用中的时间不一致么?可能是因为数据库连接没有配置 serverTimezone。
    ourslay
        20
    ourslay  
       2019-04-23 17:51:32 +08:00 via Android
    ORM 用的什么?
    MySQL 版本多少?
    Cat73
        21
    Cat73  
       2019-04-24 09:44:48 +08:00
    @rizon #18 方便的话请用 @rizon.top 后缀的邮箱向 [email protected] 发一封邮件来交流,或者通过回复来告诉我你的邮箱
    wuyao946
        22
    wuyao946  
       2019-04-24 15:51:43 +08:00
    数据库连接 url 指定时区&serverTimezone=Asia/Shanghai
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5447 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:29 · PVG 16:29 · LAX 01:29 · JFK 04:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.