在 mongo DB 中存储 java 8 LocalDate

使用Spring Boot和Mongo驱动程序。1.5.4.RELEASE3.4.2

我想存储,但我面临一个奇怪的问题:LocalDatemongo DB

LocalDate startDate = LocalDate.now();
LocalDate endDate = LocalDate.of(2020,12,01);
System.out.println("---- StartDate : ---"+startDate); 
System.out.println("-----End Date : ----"+endDate);
        
        repository.save(new Person("Mehraj","Malik", startDate, endDate));

控制台上的输出:

----开始日期 : ---2017-08-26

-----结束日期 : ----2020-12-01

但是在MongoDb中,它存储了不正确的日期。

以下是MongoDb的json:

“开始日期” : ISODate(“2017-08-25T18:30:00.000Z”),

“结束日期” :ISODate(“2020-11-30T18:30:00.000Z”)

另外,我注意到根据印度时间,存储的时间也是不正确的。

为什么控制台上的日期是正确的,但在MongoDB中却不然,如何解决这个问题?


答案 1

日期对象的 mongo-java 客户端作为 的实例返回。java.util.Date

问题可能是,当您保存 和 值时,其方法可能会使用 JVM 的默认时区来更新该值。startDateendDatetoString()

此处的文档指出,官方 BSON 规范将 BSON 日期类型称为 UTC 日期时间,这可能是您的属性在保存到 DB 之前转换为 UTC 时区的原因。LocalDateTime

此外,为了避免这种混淆,建议使用bson类型时间戳来更新日期字段。


答案 2

在MongoDB Java驱动程序3.7版本中:http://mongodb.github.io/mongo-java-driver/3.7/whats-new/ 我们可以看到驱动程序现在支持LocalDate:

JSR-310 Instant,LocalDate和LocalDateTime支持Instant,LocalDate和LocalDateTime已添加到驱动程序中。