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

Grails 4.0.3中服务器与数据库存储时间不一致问题求助

解决Grails 4.0.3保存数据库时间偏移问题

1. 修正JVM时区设置

Grails应用的时间处理依赖JVM时区,即便服务器系统时间正确,JVM可能默认使用UTC或其他时区。

  • 启动应用时添加JVM参数:-Duser.timezone=America/Sao_Paulo
  • 或者在application.yml中配置全局时区:
grails:
    gorm:
        default:
            timezone: America/Sao_Paulo

2. 配置数据库连接时区

JDBC驱动在和数据库交互时可能会自动转换时区,需在连接URL中指定巴西时区:
以MySQL为例,修改application.yml中的数据源配置:

dataSource:
    url: jdbc:mysql://localhost:3306/your_db?serverTimezone=America/Sao_Paulo&useTimezone=true&useLegacyDatetimeCode=false

3. 配置Hibernate时区

Grails 4基于Hibernate 5,需明确指定Hibernate处理时间的时区,避免转换偏差:
在application.yml中添加:

hibernate:
    jdbc:
        time_zone: America/Sao_Paulo

4. 检查实体类字段映射

确认Message类的createdOn字段映射正确,避免额外的时区干扰:

class Message {
    Long userId
    String author
    // 其他字段
    Date createdOn

    static mapping = {
        createdOn type: 'timestamp'
    }
}

5. 显式获取指定时区时间测试

如果以上配置后仍有问题,可以显式获取巴西时区的时间来验证:

def brazilTz = TimeZone.getTimeZone("America/Sao_Paulo")
def currentTime = Calendar.getInstance(brazilTz).time
def message = new Message(
    userId: springSecurityService?.principal?.id,
    author: jsonObject.get('author'),
    partId: params.partId,
    title: jsonObject.get('title'),
    text: jsonObject.get('text'),
    createdOn: currentTime
).save(flush: true, failOnError: true)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:57:14