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
相关产品推荐
相关产品推荐

