Java MongoDb BSON以UTC时间存储日期

Java MongoDb BSON以UTC时间存储日期,java,mongodb,date,mongo-java-driver,Java,Mongodb,Date,Mongo Java Driver,如果我尝试将日期字段放入文档(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 0

如果我尝试将日期字段放入文档(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不提供这种灵活性呢?
感谢使用
DateTime
(来自
org.joda.time
java.time
)时会创建一个带有时区的日期,不幸的是MongoDB不支持它。(见附件)

因此,将其保留在UTC中是一个简单可靠的解决方案,不会丢失任何数据

作为替代方案,您应该查看
LocalDateTime

它不包含日期时区,因此不需要先转换任何内容。

在我看来,mongo做得很好。您可以使用本地时区实例化日期,然后将其存储在UTC的mongo中。然后,当您要求mongo为您检索时,它会再次将日期转移到您的本地时区

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

-Duser.timezone="UTC"

通过在代码本身中将时区设置为UTC,我已经解决了这个问题

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

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

new Date(fetchedDate);

它将其转换为本地日期。

“如果我需要从另一个时区查询数据库,该怎么办?”你的确切意思是什么?基本上,
Date
类型表示时间上的一个瞬间,自Unix纪元以来在内部存储为毫秒。如果您不想在时间上存储瞬间,
Date
对您没有帮助:(好的,一般来说,最好在数据库中保留UTC格式的日期。也许你应该在api端设置时区人员。@JonSkeet我已经从IST zone插入了日期字段。如果我需要从其他时区查询数据库,该怎么办?我不需要在该时区中获取相应的日期时间吗?我如何按原样存储日期?只需重复一次即可。)ting“如果我需要从不同的时区查询DB怎么办?”实际上并没有告诉我你的意思。date值不知道时区-它只是一个瞬间。同样,你执行的任何查询都会将该值与另一个瞬间进行比较。我不知道你所说的“原样”是什么意思在这种情况下,您需要理解
日期
类型的含义。不清楚您试图实现的行为。事实上,您必须将其存储为不同的类型,或者以UTC解析原始日期/时间(即存储2015-07-01T00:00:00Z)。如果您是指org.joda.time LocalDateTime,它也不起作用。@AswinJoseRoy将此设置为应用程序启动参数,即
java-jar yourApp.jar-Duser.timezone=“UTC”