Spring Data MongoDB - 保存 LocaDate/LocalDateTime 时,值被设置为昨天

sla*_*avo 4 java spring mongodb

我在将 Java8 日期 API 值保存到 MongoDB 数据库时遇到问题。每当保存一个新的 LocalDate 实例 (LocalDate.now()) 时,我们都会获得昨天的日期和时间设置为下午 23:00 的值。例子:

dt.getDate().toString() 
Run Code Online (Sandbox Code Playgroud)

给我“2017-03-17”

但是当我查看数据库时,我有一个这样的值:

"dt" : ISODate("2017-03-16T23:00:00.000Z")
Run Code Online (Sandbox Code Playgroud)

我的时区是 UTC+01:00

use*_*814 5

MongoDB 以 UTC 时间保存日期。

LocalTime 是您的挂钟时间。

当您将其传递给 MongoDb 时,spring 将使用您的系统区域将其转换LocalTimeInstant(UTC 时间)。

考虑

LocalDateTime localDateTime = LocalDateTime.parse("2017-03-17T00:00:00")
Run Code Online (Sandbox Code Playgroud)

发生这样的事情

Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
Run Code Online (Sandbox Code Playgroud)

这是通过应用与本地时间的偏移量 (+01:00) 将本地时间更改为 UTC 即时的地方。

Output(in UTC) : 2017-03-16T23:00:00.000Z 
Run Code Online (Sandbox Code Playgroud)

  • 我想到了。我将“LocalDateTime”提供给 mongo,由于 LocalDateTime 没有时区信息,mongo 驱动程序将假定它是系统时区,然后将其转换为 UTC。如果我给它一个具有区域信息(在我的例子中为 UTC)的常规“日期”对象,mongo 不会进行任何转换。 (2认同)