如果我尝试在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不提供这种灵活性? 感谢
答案 0 :(得分:5)
IMO,mongo做的一切都是正确的。您使用本地时区实例化日期,然后将其存储在UTC中的mongo中。然后当你要求mongo为你取回它时,它会再次将日期转移到你当地的时区。
如果您不想处理时区转换,只需使用以下标志将您的本地时区设置为UTC:
-Duser.timezone="UTC"
答案 1 :(得分:0)
使用DateTime
(来自org.joda.time
或java.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);
有将其转换为本地日期。