You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot 3 Webflux R2DBC MySQL时区异常问题求助

解决Spring Boot Webflux + R2DBC MySQL时区异常问题

问题根源

MySQL服务器返回的时区是Eastern Daylight Time,这是夏令时的显示名称,而非Java ZoneId能识别的标准区域ID格式(标准格式为Continent/City,比如America/New_York)。R2DBC MySQL驱动尝试将该名称转换为Java时区时,触发DateTimeException警告。

解决方案

方案1:修改MySQL服务器时区配置(推荐)

让MySQL返回标准的区域ID,从根源解决问题:

  • 临时生效:登录MySQL执行以下命令,重启应用连接后生效:
    SET GLOBAL time_zone = 'America/New_York';
    SET time_zone = 'America/New_York';
    
  • 永久生效:修改MySQL配置文件(Linux为my.cnf,Windows为my.ini),添加/修改:
    [mysqld]
    default-time-zone = 'America/New_York'
    
    保存后重启MySQL服务。

方案2:修改R2DBC连接URL(无需修改MySQL配置)

在URL中强制指定时区,并关闭服务器时区检测,避免驱动尝试解析服务器返回的无效时区名称:
修改application.yml中的R2DBC URL,添加timeZone=America/New_York和useServerTimezone=false参数:

spring:
  r2dbc:
    url: r2dbc:mysql://localhost:3306/testdb?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=America/New_York&timeZone=America/New_York&useServerTimezone=false
    username: root
    password: root
  webflux:
    problemdetails:
      enabled: true

注:该参数对io.asyncer.r2dbc.mysql和dev.miku:r2dbc-mysql两个驱动均适用。

方案3:禁用驱动的时区警告(仅消除警告,不解决根源)

如果只是想消除警告,可在日志配置中过滤该警告信息,比如logback.xml添加:

<logger name="io.asyncer.r2dbc.mysql.MySqlConnection" level="ERROR"/>
<logger name="dev.miku.r2dbc.mysql.MySqlConnection" level="ERROR"/>

但不推荐此方案,因为时区不匹配可能导致时间数据读写错误。

验证

修改完成后,重启应用,检查日志是否不再出现时区相关警告,同时验证时间数据的读写是否正确。

内容的提问来源于stack exchange,提问作者Shakthi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:28:10