java MongoDb BSON以UTC时间存储日期

ajsxfq5m  于 2023-03-06  发布在  Java
关注(0)|答案(5)|浏览(185)

如果我尝试将一个日期字段放入一个文档(BSON)并将其写入Mongo,BSON将以UTC格式写入。

DateTime dateTime = new DateTime("2015-07-01");
Document doc = new Document("date", dateTime.toDate());

将存储为

"date" : ISODate("2015-06-30T18:30:00Z")

如果我使用相同的Java驱动程序检索它,我会得到

Wed Jul 01 00:00:00 IST 2015

太好了。这个问题没有解决方案吗?我的意思是,为什么我不能存储我想要的日期呢?如果我需要从另一个时区查询数据库呢?我会得到不同的结果吗?日期字段是Mongo的一个重要部分,有一组丰富的运算符围绕着它。但是,为什么Mongo不提供这种灵活性呢?谢谢

5cnsuln7

5cnsuln71#

IMO,mongo做得很好。你使用本地时区示例化日期,然后以UTC格式存储在mongo中。然后当你要求mongo为你检索它时,它会再次将日期转换为本地时区。
如果您不想处理时区转换,只需使用以下标志将您的本地时区设置为UTC:

-Duser.timezone="UTC"
zbdgwd5y

zbdgwd5y2#

当使用DateTime时(来自org.joda.timejava.time),会创建一个带时区的日期,但MongoDB不支持它。(参见BSON类型)
因此,在UTC中保持它是一个简单可靠的解决方案,不会丢失任何数据。
作为一种选择,你应该看看LocalDateTime,它不包含DateTimeZone,所以没有什么需要先转换。

jyztefdp

jyztefdp3#

我通过在代码本身中将时区设置为UTC来解决这个问题。

DateTimeZone zone = DateTimeZone.UTC;
    DateTimeZone.setDefault(zone);
np8igboo

np8igboo4#

有一个非常简单的解决方案。让日期在你的MongoDB中是UTC。
无论何时将其提取到UI,只需执行以下操作:

new Date(fetchedDate);

将其转换为本地日期。

jum4pzuy

jum4pzuy5#

我在从MongoDB中检索日期时遇到了同样的问题,MongoDB遵循UTC时区,这就是为什么当您执行任何日期操作时,它都会转换为UTC。
所以我使用了mongoose的post hook来转换我喜欢的时区的日期和时间。

schema.post(['find', 'findOne'], async function(docs, next) {
    docs.map((doc) => doc.createdAt= convertToTz({tz: process.env.TZ, date: doc.createdAt}))
    next();
});

这里,createdAt是文档创建的日期。convertToTz是我下面提到的一个常用函数。

const moment = require("moment-timezone");

const convertToTz = (params) => {
  try {
        let tz = params?.tz ?? process.env.TZ;
        let format = params?.format ?? "";
        return moment(params.date).tz(tz).format(format);
    } catch (error) {
       throw new Error(error);
  }
};

**注意:**此代码位于NodeJs中,但我希望这将解决您的问题。

相关问题