【问题标题】:Spring Data MongoDB - when saving LocaDate/LocalDateTime the value is being set to yesterdaySpring Data MongoDB - 保存 LocalDate/LocalDateTime 时,值被设置为昨天
【发布时间】:2017-08-09 00:36:39
【问题描述】:

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

dt.getDate().toString() 

给我“2017-03-17”

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

"dt" : ISODate("2017-03-16T23:00:00.000Z")

我的时区是 UTC+01:00

【问题讨论】:

    标签: java spring mongodb


    【解决方案1】:

    MongoDB 以 UTC 时间保存日期。

    LocalTime 是您的挂钟时间。

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

    考虑

    LocalDateTime localDateTime = LocalDateTime.parse("2017-03-17T00:00:00")
    

    这样的事情发生了

    Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
    

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

    Output(in UTC) : 2017-03-16T23:00:00.000Z 
    

    【讨论】:

    • 如果我已经给它UTC时间并且不希望mongo转换它怎么办。有没有办法做到这一点?
    • @Taher 你的日期类型是什么?如果是Instant,那么 spring mongo 将保持 UTC 时间不变。
    • 我想通了。我给 mongo 提供了LocalDateTime,由于 LocalDateTime 没有时区信息,mongo 驱动程序将假定它是系统时区,然后将其转换为 UTC。如果我给它一个常规的Date 对象,该对象具有区域信息(在我的情况下为UTC),mongo 没有进行任何转换。
    猜你喜欢
    • 2017-05-27
    • 2012-05-06
    • 2014-05-23
    • 2015-07-22
    • 2020-05-07
    • 2020-10-30
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    相关资源
    最近更新 更多