如果我尝试将一个日期字段放入一个文档(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不提供这种灵活性呢?谢谢
5条答案
按热度按时间5cnsuln71#
IMO,mongo做得很好。你使用本地时区示例化日期,然后以UTC格式存储在mongo中。然后当你要求mongo为你检索它时,它会再次将日期转换为本地时区。
如果您不想处理时区转换,只需使用以下标志将您的本地时区设置为UTC:
zbdgwd5y2#
当使用
DateTime
时(来自org.joda.time
或java.time
),会创建一个带时区的日期,但MongoDB不支持它。(参见BSON类型)因此,在UTC中保持它是一个简单可靠的解决方案,不会丢失任何数据。
作为一种选择,你应该看看
LocalDateTime
,它不包含DateTimeZone
,所以没有什么需要先转换。jyztefdp3#
我通过在代码本身中将时区设置为UTC来解决这个问题。
np8igboo4#
有一个非常简单的解决方案。让日期在你的MongoDB中是UTC。
无论何时将其提取到UI,只需执行以下操作:
将其转换为本地日期。
jum4pzuy5#
我在从MongoDB中检索日期时遇到了同样的问题,MongoDB遵循UTC时区,这就是为什么当您执行任何日期操作时,它都会转换为UTC。
所以我使用了mongoose的post hook来转换我喜欢的时区的日期和时间。
这里,createdAt是文档创建的日期。convertToTz是我下面提到的一个常用函数。
**注意:**此代码位于NodeJs中,但我希望这将解决您的问题。