发行日期春季引导数据休息

问题描述 投票:4回答:2

我有带弹簧的数据剩下一个问题,当我处理日期。在简短的,它被推迟的日期在一天。举例来说,如果我有1111年11月11日返回到我1111年11月10日。

这里有一些相关的帖子在SO(ex1ex2ex3),但它们都没有解决的问题。

我有这个LocalDate实体:

@Column(nullable=true)
private LocalDate birthDate;

我也有这个资源库:

@RepositoryRestResource(collectionResourceRel = "person", path = "person")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long>{

}

当我保存birthDate数据库(我使用MySQL),它正确保存。然而,当我做出这个查询,例如:

Person p = personRepo.findById(1L).get();

日期是获取与晚一天(就像上面的例子)。我试图执行this suggestion,也就是改变以LOCALDATE的日期和包括杰克逊注解,但它不工作。我也试图包括jackson-modules-java8,但问题依然。

现在最有趣的事情。正如我只是在考验我,包括日期1111年11月11日。我改变了今天的日期2019年2月6日。然后,取作品!在这个时候,我想,如果有人用很旧的日期的问题。因此,我试过了,例如,1970-01-01和弹簧复位1969-12-31。我意识到,如果我在数据库中包括日期以上1986年1月1日,一切工作正常。不过,如果我举出以下的东西,我得到的日期晚一天。

是什么人有这个问题的一些提示吗?

感谢您的时间!

编辑:我还检查我的数据库时区和它的确定!

+--------------------+---------------------+--------------------+
| @@GLOBAL.time_zone | @@session.time_zone | @@system_time_zone |
+--------------------+---------------------+--------------------+
| SYSTEM             | SYSTEM              | -02                |
+--------------------+---------------------+--------------------+
1 row in set (0,00 sec)
java spring-boot spring-data spring-data-rest localdate
2个回答
2
投票

最后,我找到了解决办法。经过@ILyaCyclone和@ OleV.V。评论,我开始寻找有关时区,春天开机,并LocalDate。事实上,LocalDate不携带UTC信息。然而,当我从数据库中获取这个数据,JVM需要进行转换,使SQL date成为LocalDate

因此,我做的第一件事是检查数据库时区:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;

它返回:

+--------------------+---------------------+--------------------+
| @@GLOBAL.time_zone | @@session.time_zone | @@system_time_zone |
+--------------------+---------------------+--------------------+
| SYSTEM             | SYSTEM              | -02                |
+--------------------+---------------------+--------------------+

和:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)

返回:

+--------------------------------+
| TIMEDIFF(NOW(), UTC_TIMESTAMP) |
+--------------------------------+
| -02:00:00                      |
+--------------------------------+

所有这些SQL答案是确定。那么,问题是在春天开机。有什么解决的问题是要在代码中设置的UTC。我发现这暗示here

@PostConstruct
void started() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}

在此之后,所有的日期开始正常工作。

解决这个问题。但是,我不知道有关日期后至1986年之前,如果有人有一些提示,请与我分享这个问题的线索。

谢谢你们谁投入一些精力来帮助我。我真的很感激。


0
投票

使用依赖https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-hibernate5

例如,如果您使用的摇篮

implementation ('com.fasterxml.jackson.datatype:jackson-datatype-hibernate5:2.9.8')
© www.soinside.com 2019 - 2024. All rights reserved.