spring-data-jpa java8 Instant 差8小时可能的情况。

关于spring-data-jpa注解@CreatedDate、@LastModifiedDate的使用过程中,mysql数据库存储Instant类型时间与北京时间差8小时。

已尝试多种解决方案,但均未成功,过程如下。如果不想看具体解决明细,请直接到最后。

1、使用Instant.now()获取当前时间,在svcImpl中存储到实体中进行保存。失败。
2、使用Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8));获取当前时间并强制添加8小时,在svcImpl中存储到实体中进行保存。失败。
3、参照github上Jhipster的Issues提供的方案,在application-dev.yml文件中,添加jpa.properties.hibernate.jdbc.time_zone: UTC,设置UTC协调世界时。失败。
4、实验了保留第3条UTC和去掉第3条UTC的情况下,在spring.datasource.url添加中国标准时间serverTimezone=Asia/Shanghai。失败。
5、引入jsr310依赖,在@SpringBootApplication注解上方添加了@EntityScan(basePackageClasses = {Application.class, Jsr310JpaConverters.class})。失败。
6、删除Spring.datasource.url上的useLegacyDatetimeCode=false,和更新Spring.datasource.url上的useLegacyDatetimeCode=true。均失败。
7、更换AbstractAuditingEntity下@CreatedDate、@LastModifiedDate的类型为Date和timestamp。失败。
8、将公网数据库备份到本地,进行存储。失败。
9、打印dao层执行sql,查看存储参数,参数值为北京时间,但入库时间差8小时。失败。

解决方案:

后来发现,是因为Springboot的application.yml中配置了jackson,导致时区差8小时。所以去掉application.yml中的配置就好了。

反思:
我认为关于instant这个类型,除了展示和入库,在代码中跑的时候,都用时间戳进行处理,这样就能保证整个工程中的时间都是对的。在哪里需要就在进行转换。

你可能感兴趣的:(spring-data-jpa java8 Instant 差8小时可能的情况。)