MongoDb BSON以UTC时间存储日期

时间:2015-07-27 13:35:03

标签: java mongodb date mongo-java-driver

如果我尝试在Document(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")

在Mongo。而且,如果我使用相同的Java驱动程序检索它,我会将其作为

Wed Jul 01 00:00:00 IST 2015

大。这个没有解决方案吗?我的意思是,为什么我不能按照自己的意愿存储日期?如果我需要从另一个时区查询数据库怎么办?我会得到不同的结果?日期字段是Mongo的重要组成部分,其中包含丰富的运算符。不过,为什么Mongo不提供这种灵活性? 感谢

4 个答案:

答案 0 :(得分:5)

IMO,mongo做的一切都是正确的。您使用本地时区实例化日期,然后将其存储在UTC中的mongo中。然后当你要求mongo为你取回它时,它会再次将日期转移到你当地的时区。

如果您不想处理时区转换,只需使用以下标志将您的本地时区设置为UTC:

-Duser.timezone="UTC"

答案 1 :(得分:0)

使用DateTime(来自org.joda.timejava.time)时会创建一个带时区的日期,但遗憾的是MongoDB不支持它。 (见BSON Types

因此,在UTC中保留它是一种简单可靠的解决方案,而不会丢失任何数据。

作为替代方案,您应该查看LocalDateTime。 它不包含DateTimeZone,因此不需要先转换任何内容。

答案 2 :(得分:0)

我通过在代码本身内设置我的时区为UTC来解决问题。

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

答案 3 :(得分:0)

有一个非常简单的解决方案。让日期在UTC在MongoDB中。
每当你把它送到你的UI,只是做:

new Date(fetchedDate);

有将其转换为本地日期。