2017-08-26 59 views
0

使用Spring启动1.5.4.RELEASE和Mongo驱动程序3.4.2在MongoDB中存储java 8 LocalDate

我想存储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年8月26日---

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

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

以下是从MongoDB的JSON的:

“的startDate”:ISODate( “2017-08-25T18:30:00.000Z”),

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

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

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

+1

MongoDB存储UTC日期时间,LocalDate不包含时区 – Jerry06

+0

Mongo Java客户端可以自由地表示您的日期对象。如果要存储字符串,则请改为 –

+0

LocalDate忽略时间字段。他们没有定义。如果时间很重要,请使用LocalDate.atStartOfDay并在mongodb中存储日期时间 – thst

回答

2

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

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

doc here指出官方BSON规范将BSON日期类型引用为UTC日期时间。这可能是您的LocalDateTime属性在保存到数据库之前转换为UTC时区的原因。

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

+5

我梦想有一天,规范不会根据假设破坏数据,只是将数据存储为此。就像Java 8使用新的日期格式一样。 –