在 mongoDB 中存储 java 8 LocalDate

Posted

技术标签:

【中文标题】在 mongoDB 中存储 java 8 LocalDate【英文标题】:Storing java 8 LocalDate in mongo DB 【发布时间】:2018-02-04 03:27:22 【问题描述】:

使用 Spring boot 1.5.4.RELEASE 和 Mongo 驱动程序 3.4.2

我想将LocalDate 存储在mongo 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:

"startDate" : ISODate("2017-08-25T18:30:00.000Z"),

"endDate" :ISODate("2020-11-30T18:30:00.000Z")

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

有人可以在这里帮助我吗?为什么日期在控制台上是正确的,但在 MongoDB 中却不正确,以及如何解决这个问题。

【问题讨论】:

MongoDB存储UTC日期时间,LocalDate不包含时区 Mongo Java 客户端可以随意代表您的日期对象。如果你想存储字符串,那就这样做吧 LocalDate 忽略时间字段。它们是未定义的。如果时间很重要,请使用 LocalDate.atStartOfDay 并将日期时间存储在 mongodb @Jerry06 ISO 和 UTC 一样吗? '因为根据发布的 json 它在 ISO 中显示? iso 是时间格式,utc 是时区('no timezone' timezone) 【参考方案1】:

date object returns 的 mongo-java 客户端作为 java.util.Date.

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

doc here 声明 官方 BSON 规范将 BSON 日期类型称为 UTC 日期时间。 这可能是您的 LocalDateTime 属性被设置为在保存到数据库之前转换为 UTC 时区。

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

【讨论】:

我梦想有一天规范不会破坏基于假设的数据,而只是将数据存储为这样。就像 Java 8 使用新的日期格式一样。【参考方案2】:

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

JSR-310 即时、LocalDate 和 LocalDateTime 支持 驱动程序已添加对 Instant、LocalDate 和 LocalDateTime 的支持。

【讨论】:

以上是关于在 mongoDB 中存储 java 8 LocalDate的主要内容,如果未能解决你的问题,请参考以下文章

如何通过java驱动程序在mongodb中存储38位整数

8.3 操作MongoDB数据库

java 实现mongodb中gridFS文件存储

在 MongoDB 中使用 QueryDSL - java.lang.NoClassDefFoundError

mongodb安装

Python中mongodb使用